#Data

Loading data from the UNGDC data

#Loading packages and data
library(readtext)
library(quanteda)
library(dplyr)
library(tidyr)
library(stringr)
library(ggplot2)
library(rworldmap)
library(RColorBrewer)
library(haven)
library(readxl)

DATA_DIR <- "~/Dropbox/Research/UNGDC projects/UN Data/" 

ungd_files <- readtext(paste0(DATA_DIR, "TXT/*"), 
                                 docvarsfrom = "filenames", 
                                 dvsep="_", 
                                 docvarnames = c("Country", "Session", "Year"))


ungd_files$doc_id <- str_replace(ungd_files$doc_id , ".txt", "") %>%
   str_replace(. , "_\\d{2}", "")

##Creating corpus object(s)

ungd_corpus <- corpus(ungd_files, text_field = "text") 

ungdc.2019 <- corpus_subset(ungd_corpus, Year==2019)

corp_summary <- summarise(group_by(summary(ungd_corpus, n = 9349),Year),
                           total_speeches=n(),total_sentences=sum(Sentences),total_words=sum(Tokens))

readr::write_csv(corp_summary, "corp_summary.csv")

#Pre-processing

Tokenizing corpus.

#Tokenization and basic pre-processing
tok <- tokens(ungd_corpus, what = "word",
              remove_punct = TRUE,
              remove_symbols = TRUE,
              remove_numbers = TRUE,
              remove_url = TRUE,
              split_hyphens = FALSE,
              verbose = TRUE)
Creating a tokens object from a corpus input...
...starting tokenization
...preserving hyphens
...preserving social media tags (#, @)
...tokenizing 1 of 1 blocks
...segmenting tokens
...serializing tokens 103147 unique types
...removing separators, punctuation, symbols, numbers, URLs 
...total elapsed:  23 seconds.
Finished constructing tokens from 9,349 texts.

Lowercasing and removing stopwords

tok <- tokens_tolower(tok)
tok.r <- tokens_select(tok, stopwords("english"), selection = "remove", padding = FALSE)

#Setting up agreed dictionaries

Creating compound tokens from the key terms (phrases) in our dictionaries:


mylist <- list( c("air", "pollution"), c("mental", "disorder"), c("mental", "disorders"), c("climate","change"), c("changing","climate"), c("climate","emergency"), c("climate","crisis"), c("climate","decay"), c("global","warming"), c("green","house"), c("extreme","weather"), c("global", "environmental", "change"), c("climate","variability"),  c("low","carbon"), c("renewable","energy"), c("carbon","emission"), c("carbon","emissions"), c("carbon","dioxide"), c("co2","emission"), c("co2","emissions"), c("climate","pollutant"), c("climate","pollutants"), c("carbon","neutral"), c("carbon","neutrality"), c("climate","neutrality"), c("climate","action"), c("net","zero")) 
 
tok.compound <- tokens_compound(tok.r, mylist, valuetype = "fixed", concatenator = "_")

Creating the dictionary of climate change terms:

climate_dict <- dictionary(list(climate =  c("climate_change", "changing_climate", "climate_emergency", "climate_crisis", "climate_decay", "global_warming", "green_house", "temperature", "extreme_weather", "global_environmental_change", "climate_variability", "greenhouse", "greenhouse-gas", "low_carbon", "ghge", "ghges", "renewable_energy", "carbon_emission", "carbon_emissions", "carbon_dioxide", "carbon-dioxide", "co2_emission", "co2_emissions", "climate_pollutant", "climate_pollutants", "decarbonization", "decarbonisation", "carbon_neutral", "carbon-neutral", "carbon_neutrality", "climate_neutrality", "climate_action", "net-zero", "net_zero"
)))

Creating the dictionary of health terms:

health_dict <- dictionary(list(health = c("malaria", "diarrhoea", "infection", "disease", "diseases", "sars", "measles", "pneumonia", "epidemic", "epidemics", "pandemic", "pandemics", "epidemiology", "healthcare", "health", "mortality", "morbidity", "nutrition", "illness", "illnesses", "ncd", "ncds", "air_pollution", "nutrition", "malnutrition", "malnourishment", "mental_disorder", "mental_disorders", "stunting")))

KWIC

Performing a keyword-in-context search. The window is set to 25 words before and after the term - reflecting approximately half a paragraph before and after the term (on average a paragraph in English is 50 words). UNGD speeches are highly structured documents drafted over long periods of time and reflect internal discussions and negotiations in government. Hence we assume that terms appearing within specific proximity of each other are related through the structured process of document generation.

We search for terms from our health dictionary and show the 25-word context around them.

tok.hea <- kwic(tok.compound, health_dict, window = 25, valuetype = "fixed")

readr::write_csv(tok.hea, "health_kwic_25_fixed.csv")

We search for terms from our climate change dictionary and show the 25-word context around them.

tok.cc <- kwic(tok.compound, climate_dict, window = 25, valuetype = "fixed")

readr::write_csv(tok.cc, "climate_kwic_25_fixed.csv")

To tap into the core proposition of this analysis - the link between climate change and health terms - we take the 25-word context around the health terms and search this context for climate change terms.

Text surrounding health terms (25 words each side) is saved and transformed to a corpus object. We then perform key-word-in-context search of this health related corpus for the terms in our climate change dictionary.

corpus_health <- corpus(tok.hea, split_context = FALSE, extract_keyword = TRUE)

tok.climate.kwic <- kwic(corpus_health, climate_dict, window = 25, valuetype = "fixed")

readr::write_csv(tok.climate.kwic, "intersection_kwic_25_fixed.csv")

Robustness analysis

For robustness analysis we looked at different context window sizes and manually assessed them for the balance of false positives vs false negatives.

tok.hea.5 <- kwic(tok.compound, health_dict, window = 5, valuetype = "fixed")
tok.cc.5 <- kwic(tok.compound, climate_dict, window = 5, valuetype = "fixed")
corpus_health.5 <- corpus(tok.hea.5, split_context = FALSE, extract_keyword = TRUE)
tok.climate.kwic.5 <- kwic(corpus_health.5, climate_dict, window = 5, valuetype = "fixed")
readr::write_csv(tok.climate.kwic.5, "intersection_kwic_5_fixed.csv")
readr::write_csv(tok.hea.5, "health_kwic_5_fixed.csv")
readr::write_csv(tok.cc.5, "climate_kwic_5_fixed.csv")

tok.hea.10 <- kwic(tok.compound, health_dict, window = 10, valuetype = "fixed")
tok.cc.10 <- kwic(tok.compound, climate_dict, window = 10, valuetype = "fixed")
corpus_health.10 <- corpus(tok.hea.10, split_context = FALSE, extract_keyword = TRUE)
tok.climate.kwic.10 <- kwic(corpus_health.10, climate_dict, window = 10, valuetype = "fixed")
readr::write_csv(tok.climate.kwic.10, "intersection_kwic_10_fixed.csv")
readr::write_csv(tok.hea.10, "health_kwic_10_fixed.csv")
readr::write_csv(tok.cc.10, "climate_kwic_10_fixed.csv")

tok.hea.30 <- kwic(tok.compound, health_dict, window = 30, valuetype = "fixed")
tok.cc.30 <- kwic(tok.compound, climate_dict, window = 30, valuetype = "fixed")
corpus_health.30 <- corpus(tok.hea.30, split_context = FALSE, extract_keyword = TRUE)
tok.climate.kwic.30 <- kwic(corpus_health.30, climate_dict, window = 30, valuetype = "fixed")
readr::write_csv(tok.climate.kwic.30, "intersection_kwic_30_fixed.csv")
readr::write_csv(tok.hea.30, "health_kwic_30_fixed.csv")
readr::write_csv(tok.cc.30, "climate_kwic_30_fixed.csv")

tok.hea.50 <- kwic(tok.compound, health_dict, window = 50, valuetype = "fixed")
tok.cc.50 <- kwic(tok.compound, climate_dict, window = 50, valuetype = "fixed")
corpus_health.50 <- corpus(tok.hea.50, split_context = FALSE, extract_keyword = TRUE)
tok.climate.kwic.50 <- kwic(corpus_health.50, climate_dict, window = 50, valuetype = "fixed")
readr::write_csv(tok.climate.kwic.50, "intersection_kwic_50_fixed.csv")
readr::write_csv(tok.hea.50, "health_kwic_50_fixed.csv")
readr::write_csv(tok.cc.50, "climate_kwic_50_fixed.csv")
health_dfm <- dfm(corpus_health)

corpus_climate <- corpus(tok.cc, split_context = FALSE, extract_keyword = TRUE)
climate_dfm <- dfm(corpus_climate)

corpus_intersection <- corpus(tok.climate.kwic, split_context = FALSE, extract_keyword = TRUE)
intersection_dfm <- dfm(corpus_intersection)

health <- convert(health_dfm, "data.frame")
climate <- convert(climate_dfm, "data.frame")
intersection <- convert(intersection_dfm, "data.frame")

names(health)[1] <- "docid"
names(climate)[1] <- "docid"
names(intersection)[1] <- "docid"

health$"docid" <- str_extract(health$docid, "^([^.]+)")
climate$"docid" <- str_extract(climate$docid, "^([^.]+)")
intersection$"docid" <- str_extract(intersection$docid, "^([^.]+)")

health_counts <- health %>% group_by(docid) %>% summarise(health_count = n())
climate_counts <- climate %>% group_by(docid) %>% summarise(climate_count = n())
intersection_counts <- intersection %>% group_by(docid) %>% summarise(intersection_count = n())

total_counts <- climate_counts %>% 
  full_join(health_counts, by = "docid") %>% 
  full_join(intersection_counts, by = "docid") %>%
  replace_na(list(health_count=0, climate_count=0, intersection_count=0)) %>%
  separate(docid, c("country", "year"), "_")

total_counts$year <- as.numeric(total_counts$year)

total_counts <- arrange(total_counts, country, year)
readr::write_csv(total_counts, "total_counts.csv")

Maps of mention counts

Map for 2019 of PH and CC

Keeping only country-years with at least one mention of CC in PH conext


map <- joinCountryData2Map(subset(total_counts, year==2019 & health_count>0), joinCode="ISO3", nameJoinColumn="country")
117 codes from your data successfully matched countries in the map
0 codes from your data failed to match with a country code in the map
126 codes from the map weren't represented in your data
new_world <- subset(map, continent != "Antarctica")

pdf("worldmap_2019_health.pdf", width = 7, height = 3)

par(mai=c(0,0,0.2,0),xaxs="i",yaxs="i")

mapParams <- mapCountryData(new_world, nameColumnToPlot="health_count", 
                            mapTitle="2019 UN General Debate: Health", 
                            catMethod = "categorical", 
                            colourPalette = "heat", 
                            oceanCol = "lightblue", 
                            missingCountryCol = "white", 
                            addLegend="FALSE")

do.call( addMapLegendBoxes, c(mapParams,title="Number of mentions",x = "bottom", horiz=TRUE, cex=0.5))

dev.off()
null device 
          1 

map <- joinCountryData2Map(subset(total_counts, year==2019 & climate_count>0), joinCode="ISO3", nameJoinColumn="country")
174 codes from your data successfully matched countries in the map
1 codes from your data failed to match with a country code in the map
69 codes from the map weren't represented in your data
new_world <- subset(map, continent != "Antarctica")

pdf("worldmap_2019_climate.pdf", width = 7, height = 3)

par(mai=c(0,0,0.2,0),xaxs="i",yaxs="i")

mapParams <- mapCountryData(new_world, nameColumnToPlot="climate_count", 
                            mapTitle="2019 UN General Debate: Climate Change", 
                            catMethod = "categorical", 
                            colourPalette = "heat", 
                            oceanCol = "lightblue", 
                            missingCountryCol = "white", 
                            addLegend="FALSE")

do.call( addMapLegendBoxes, c(mapParams,title="Number of mentions",x = "bottom", horiz=TRUE, cex=0.5))

dev.off()
null device 
          1 

map <- joinCountryData2Map(subset(total_counts, year==2019 & intersection_count>0), joinCode="ISO3", nameJoinColumn="country")
43 codes from your data successfully matched countries in the map
0 codes from your data failed to match with a country code in the map
200 codes from the map weren't represented in your data
new_world <- subset(map, continent != "Antarctica")

pdf("worldmap_2019_intersection.pdf", width = 7, height = 3)

par(mai=c(0,0,0.2,0),xaxs="i",yaxs="i")

mapParams <- mapCountryData(new_world, nameColumnToPlot="intersection_count", 
                            mapTitle="2019 UN General Debate: Intersection", 
                            catMethod = "categorical", 
                            colourPalette = "heat", 
                            oceanCol = "lightblue", 
                            missingCountryCol = "white", 
                            addLegend="FALSE")

do.call( addMapLegendBoxes, c(mapParams,title="Number of mentions",x = "bottom", horiz=TRUE, cex=0.5))

dev.off()
null device 
          1 

Country plots

##USA


total_counts <- total_counts %>% add_row(country = "USA", year = 2018, climate_count = 0, health_count = 0, intersection_count  =  0)
total_counts <- total_counts %>% add_row(country = "USA", year = 2019, climate_count = 0, health_count = 0, intersection_count  =  0)

ggplot(subset(total_counts, country=="USA"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("USA") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_USA.pdf")
Saving 7.29 x 4.51 in image

##GBR


total_counts <- total_counts %>% add_row(country = "GBR", year = 1970, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "GBR", year = 1971, climate_count = 0, health_count = 0, intersection_count  =  0)

ggplot(subset(total_counts, country=="GBR"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("UK") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_GBR.pdf")
Saving 7.29 x 4.51 in image

##Germany


total_counts <- total_counts %>% add_row(country = "DEU", year = 1970, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "DEU", year = 1971, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "DEU", year = 1972, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "DEU", year = 1973, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "DEU", year = 1974, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "DEU", year = 1975, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "DEU", year = 1976, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "DEU", year = 1977, climate_count = 0, health_count = 0, intersection_count  =  0)


ggplot(subset(total_counts, country=="DEU"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("Germany") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_DEU.pdf")
Saving 7.29 x 4.51 in image

##France

ggplot(subset(total_counts, country=="FRA"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("France") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_FRA.pdf")
Saving 7.29 x 4.51 in image

##China

total_counts <- total_counts %>% add_row(country = "CHN", year = 1971, climate_count = 0, health_count = 0, intersection_count  =  0) 

ggplot(subset(total_counts, country=="CHN"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("China") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_CHN.pdf")
Saving 7.29 x 4.51 in image

##Norway

total_counts <- total_counts %>% add_row(country = "NOR", year = 1970, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "NOR", year = 1971, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "NOR", year = 1972, climate_count = 0, health_count = 0, intersection_count  =  0)

ggplot(subset(total_counts, country=="NOR"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("Norway") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_NOR.pdf")
Saving 7.29 x 4.51 in image

##Australia

total_counts <- total_counts %>% add_row(country = "AUS", year = 1970, climate_count = 0, health_count = 0, intersection_count  =  0)

ggplot(subset(total_counts, country=="AUS"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("Australia") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_AUS.pdf")
Saving 7.29 x 4.51 in image

##India

total_counts <- total_counts %>% add_row(country = "IND", year = 1970, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "IND", year = 1971, climate_count = 0, health_count = 0, intersection_count  =  0)

ggplot(subset(total_counts, country=="IND"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("India") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_IND.pdf")
Saving 7.29 x 4.51 in image

##Belgium

total_counts <- total_counts %>% add_row(country = "BEL", year = 1970, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "BEL", year = 1971, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "BEL", year = 1972, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "BEL", year = 1973, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "BEL", year = 1974, climate_count = 0, health_count = 0, intersection_count  =  0) 

ggplot(subset(total_counts, country=="BEL"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("Belgium") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_BEL.pdf")
Saving 7.29 x 4.51 in image

##Japan


total_counts <- total_counts %>% add_row(country = "JPN", year = 1970, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "JPN", year = 1971, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "JPN", year = 1972, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "JPN", year = 1973, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "JPN", year = 1974, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "JPN", year = 1975, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "JPN", year = 1976, climate_count = 0, health_count = 0, intersection_count  =  0) %>% add_row(country = "JPN", year = 1977, climate_count = 0, health_count = 0, intersection_count  =  0) 

ggplot(subset(total_counts, country=="JPN"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("Japan") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_JPN.pdf")
Saving 7.29 x 4.51 in image

#EU

#eu presidencies

total_counts$country_alt <- total_counts$country

total_counts$country_alt[total_counts$country== "BEL" & total_counts$year == 1970] <- "EU"
total_counts$country_alt[total_counts$country== "ITA" & total_counts$year == 1971] <- "EU"
total_counts$country_alt[total_counts$country== "NLD" & total_counts$year == 1972] <- "EU"
total_counts$country_alt[total_counts$country== "DNK" & total_counts$year == 1973] <- "EU"
total_counts$country_alt[total_counts$country== "FRA" & total_counts$year == 1974] <- "EU"
total_counts$country_alt[total_counts$country== "ITA" & total_counts$year == 1975] <- "EU"
total_counts$country_alt[total_counts$country== "NLD" & total_counts$year == 1976] <- "EU"
total_counts$country_alt[total_counts$country== "BEL" & total_counts$year == 1977] <- "EU"
total_counts$country_alt[total_counts$country== "DEU" & total_counts$year == 1978] <- "EU"
total_counts$country_alt[total_counts$country== "IRL" & total_counts$year == 1979] <- "EU"
total_counts$country_alt[total_counts$country== "LUX" & total_counts$year == 1980] <- "EU"
total_counts$country_alt[total_counts$country== "GBR" & total_counts$year == 1981] <- "EU"
total_counts$country_alt[total_counts$country== "DNK" & total_counts$year == 1982] <- "EU"
total_counts$country_alt[total_counts$country== "GRC" & total_counts$year == 1983] <- "EU"
total_counts$country_alt[total_counts$country== "IRL" & total_counts$year == 1984] <- "EU"
total_counts$country_alt[total_counts$country== "LUX" & total_counts$year == 1985] <- "EU"
total_counts$country_alt[total_counts$country== "GBR" & total_counts$year == 1986] <- "EU"
total_counts$country_alt[total_counts$country== "DNK" & total_counts$year == 1987] <- "EU"
total_counts$country_alt[total_counts$country== "GRC" & total_counts$year == 1988] <- "EU"
total_counts$country_alt[total_counts$country== "FRA" & total_counts$year == 1989] <- "EU"
total_counts$country_alt[total_counts$country== "ITA" & total_counts$year == 1990] <- "EU"
total_counts$country_alt[total_counts$country== "NLD" & total_counts$year == 1991] <- "EU"
total_counts$country_alt[total_counts$country== "GBR" & total_counts$year == 1992] <- "EU"
total_counts$country_alt[total_counts$country== "BEL" & total_counts$year == 1993] <- "EU"
total_counts$country_alt[total_counts$country== "DEU" & total_counts$year == 1994] <- "EU"
total_counts$country_alt[total_counts$country== "ESP" & total_counts$year == 1995] <- "EU"
total_counts$country_alt[total_counts$country== "IRL" & total_counts$year == 1996] <- "EU"
total_counts$country_alt[total_counts$country== "LUX" & total_counts$year == 1997] <- "EU"
total_counts$country_alt[total_counts$country== "AUT" & total_counts$year == 1998] <- "EU"
total_counts$country_alt[total_counts$country== "FIN" & total_counts$year == 1999] <- "EU"
total_counts$country_alt[total_counts$country== "FRA" & total_counts$year == 2000] <- "EU"
total_counts$country_alt[total_counts$country== "BEL" & total_counts$year == 2001] <- "EU"
total_counts$country_alt[total_counts$country== "DNK" & total_counts$year == 2002] <- "EU"
total_counts$country_alt[total_counts$country== "ITA" & total_counts$year == 2003] <- "EU"
total_counts$country_alt[total_counts$country== "NLD" & total_counts$year == 2004] <- "EU"
total_counts$country_alt[total_counts$country== "GBR" & total_counts$year == 2005] <- "EU"
total_counts$country_alt[total_counts$country== "FIN" & total_counts$year == 2006] <- "EU"
total_counts$country_alt[total_counts$country== "PRT" & total_counts$year == 2007] <- "EU"
total_counts$country_alt[total_counts$country== "FRA" & total_counts$year == 2008] <- "EU"
total_counts$country_alt[total_counts$country== "SWE" & total_counts$year == 2009] <- "EU"
total_counts$country_alt[total_counts$country== "BEL" & total_counts$year == 2010] <- "EU"

total_counts <- total_counts %>% add_row(country_alt = "EU", year = 1970, climate_count = 0, health_count = 0, intersection_count  =  0) %>%  add_row(country_alt = "EU", year = 1971, climate_count = 0, health_count = 0, intersection_count  =  0)

ggplot(subset(total_counts, country_alt=="EU"), aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= health_count), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= climate_count), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= intersection_count), colour = "red", alpha = 0.9) +
  ggtitle("EU") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

ggsave("timeseries_all_total_count_EU.pdf")
Saving 7.29 x 4.51 in image

Time series of total counts plot

total counts

# calculating the total number of mentions by year
sum <- summarise(group_by(total_counts, year), 
                 sum_CC = sum(climate_count), sum_PH = sum(health_count), sum_int = sum(intersection_count),
                 mean_CC = mean(climate_count), mean_PH = mean(health_count), mean_int = mean(intersection_count))
ggplot(sum, aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= sum_PH), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= sum_CC), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
#  geom_line(aes(y= count), colour = "black", alpha = 0.9) +
  #ggtitle("Political engagement with the intersection of climate change and health") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))+
 annotate("text", x = 2000, y = 850, label = "Climate Change", colour = "darkgreen")+
  annotate("text", x = 1993, y = 250, label = "Health", colour = "blue")

ggsave("timeseries_PHCC_total_count.pdf")
Saving 7.29 x 4.51 in image

ggplot(sum, aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= sum_int), colour = "red", alpha = 0.9) +
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019)) +
   annotate("text", x = 2015, y = 20, label = "Intersection", colour = "red")

ggsave("timeseries_intersection_total_count.pdf")
Saving 7.29 x 4.51 in image

readr::write_csv(sum, "figure57.csv")
ggplot(sum, aes(x=year)) +
  theme_bw() +
  geom_line(aes(y= sum_PH), colour = "blue", alpha = 0.9, linetype="dotdash") +
  geom_line(aes(y= sum_CC), colour = "darkgreen", alpha = 0.9, linetype="dashed") +
  geom_line(aes(y= sum_int), colour = "red", alpha = 0.9) +
  #ggtitle("Political engagement with the intersection of climate change and health") + 
  ylab("Total number of references per UNGD session") + xlab("Year") + 
#  scale_y_continuous(limits=c(0, 140), breaks = c(1, 50, 100, 134)) +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))+
 annotate("text", x = 2000, y = 850, label = "Climate Change", colour = "darkgreen")+
  annotate("text", x = 1993, y = 250, label = "Health", colour = "blue") +
  annotate("text", x = 2015, y = 100, label = "Intersection", colour = "red")

ggsave("timeseries_all_total_count.pdf")
Saving 7.29 x 4.51 in image

Proportion of countries presentation

Proportion of countries that had at least one mention

Data preparation


climate_speeches <- total_counts %>% filter(climate_count>0) %>% group_by(year) %>% tally(name = "climate_speeches")
health_speeches <- total_counts %>% filter(health_count>0) %>% group_by(year) %>% tally(name = "health_speeches")
intersection_speeches <- total_counts %>% filter(intersection_count>0) %>% group_by(year) %>% tally(name = "intersection_speeches")
total_speeches <- ungd_files %>% group_by(Year) %>% tally(name = "total_speeches")

proportions <- left_join(total_speeches, health_speeches, by = c("Year"="year")) %>% 
  left_join(., climate_speeches, by = c("Year"="year")) %>% 
  left_join(., intersection_speeches, by = c("Year"="year")) %>% 
  replace_na(list(health_speeches=0, climate_speeches=0, intersection_speeches=0))

proportions$percent_int <- proportions$intersection_speeches/proportions$total_speeches*100
proportions$percent_CC <- proportions$climate_speeches/proportions$total_speeches*100
proportions$percent_PH <- proportions$health_speeches/proportions$total_speeches*100

readr::write_csv(proportions, "proportion_results.csv")

Plotting the country proportion

ggplot(proportions, aes(x=Year, y=percent_CC, group = 1)) +
  geom_line(colour="darkgreen", size=1) +
  theme_bw() +
  #ggtitle("Political engagement with the intersection of climate change and health") + 
  ylab("Proportion of countries discussing climate change, %") + xlab("Year") + 
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

 ggsave("total_percent_CC.pdf")
Saving 7.29 x 4.51 in image

ggplot(proportions, aes(x=Year, y=percent_PH, group = 1)) +
  geom_line(colour="blue", size=1) +
  theme_bw() +
  #ggtitle("Political engagement with the intersection of climate change and health") + 
  ylab("Proportion of countries discussing health, %") + xlab("Year") + 
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000,2010, 2019))

  ggsave("total_percent_PH.pdf")
Saving 7.29 x 4.51 in image

ggplot(proportions, aes(x=Year, y=percent_int, group = 1)) +
  geom_line(colour="red", size=1) +
  theme_bw() +
  #ggtitle("Political engagement with the intersection of climate change and health") + 
  ylab("Proportion of countries discussing intersection, %") + xlab("Year") + 
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("total_percent_intersection.pdf")
Saving 7.29 x 4.51 in image

ggplot(proportions, aes(x=Year)) +
  geom_line(aes(y=percent_int), colour="red", size=1) +
  geom_line(aes(y=percent_CC), colour="darkgreen", linetype = "dashed", size=1) +
  geom_line(aes(y=percent_PH), colour="blue", linetype = "dotdash", size=1) +
  theme_bw() +
  #ggtitle("Political engagement with the intersection of climate change and health") + 
  ylab("Proportion of countries, %") + xlab("Year") + 
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))+
 annotate("text", x = 2014, y = 30, label = "Intersection", colour = "red")+
  annotate("text", x = 1975, y = 55, label = "Health", colour = "blue") +
  annotate("text", x = 1988, y = 27, label = "Climate Change", colour = "darkgreen")

  ggsave("all_three_percent.pdf")
Saving 7.29 x 4.51 in image

#Tier Analysis

sids_countries <- c("ASM","AIA","ATG","ABW","BHS","BHR","BRB","BLZ","BMU","CPV","COM","COK","CUB","DMA","DOM","FJI","GRD","GUM","GNB","GUY","HTI","JAM","KIR","MDV","MHL","MUS","FSM","MSR","NRU","NCL","NIU","PLW","PNG","PRI","KNA","LCA","VCT","WSM","STP","SYC","SGP","SLB","SUR","TLS","TON","TTO","TUV","VUT")
tier1_countries <- c("USA","EU", "CHN")
tier2_countries <- c("POL","AUS", "ZAF", "BRA", "IND", "FRA", "DEU", "IDN", "GBR")

total_counts$country_groups <- ifelse(total_counts$country %in% sids_countries, "SIDS", "none")
total_counts$country_groups[total_counts$country %in% tier1_countries] <- "Tier1"
total_counts$country_groups[total_counts$country %in% tier2_countries] <- "Tier2"

#eu presidencies
total_counts$country_groups[total_counts$country== "BEL" & total_counts$year == 1970] <- "Tier1"
total_counts$country_groups[total_counts$country== "ITA" & total_counts$year == 1971] <- "Tier1"
total_counts$country_groups[total_counts$country== "NLD" & total_counts$year == 1972] <- "Tier1"
total_counts$country_groups[total_counts$country== "DNK" & total_counts$year == 1973] <- "Tier1"
total_counts$country_groups[total_counts$country== "FRA" & total_counts$year == 1974] <- "Tier1"
total_counts$country_groups[total_counts$country== "ITA" & total_counts$year == 1975] <- "Tier1"
total_counts$country_groups[total_counts$country== "NLD" & total_counts$year == 1976] <- "Tier1"
total_counts$country_groups[total_counts$country== "BEL" & total_counts$year == 1977] <- "Tier1"
total_counts$country_groups[total_counts$country== "DEU" & total_counts$year == 1978] <- "Tier1"
total_counts$country_groups[total_counts$country== "IRL" & total_counts$year == 1979] <- "Tier1"
total_counts$country_groups[total_counts$country== "LUX" & total_counts$year == 1980] <- "Tier1"
total_counts$country_groups[total_counts$country== "GBR" & total_counts$year == 1981] <- "Tier1"
total_counts$country_groups[total_counts$country== "DNK" & total_counts$year == 1982] <- "Tier1"
total_counts$country_groups[total_counts$country== "GRC" & total_counts$year == 1983] <- "Tier1"
total_counts$country_groups[total_counts$country== "IRL" & total_counts$year == 1984] <- "Tier1"
total_counts$country_groups[total_counts$country== "LUX" & total_counts$year == 1985] <- "Tier1"
total_counts$country_groups[total_counts$country== "GBR" & total_counts$year == 1986] <- "Tier1"
total_counts$country_groups[total_counts$country== "DNK" & total_counts$year == 1987] <- "Tier1"
total_counts$country_groups[total_counts$country== "GRC" & total_counts$year == 1988] <- "Tier1"
total_counts$country_groups[total_counts$country== "FRA" & total_counts$year == 1989] <- "Tier1"
total_counts$country_groups[total_counts$country== "ITA" & total_counts$year == 1990] <- "Tier1"
total_counts$country_groups[total_counts$country== "NLD" & total_counts$year == 1991] <- "Tier1"
total_counts$country_groups[total_counts$country== "GBR" & total_counts$year == 1992] <- "Tier1"
total_counts$country_groups[total_counts$country== "BEL" & total_counts$year == 1993] <- "Tier1"
total_counts$country_groups[total_counts$country== "DEU" & total_counts$year == 1994] <- "Tier1"
total_counts$country_groups[total_counts$country== "ESP" & total_counts$year == 1995] <- "Tier1"
total_counts$country_groups[total_counts$country== "IRL" & total_counts$year == 1996] <- "Tier1"
total_counts$country_groups[total_counts$country== "LUX" & total_counts$year == 1997] <- "Tier1"
total_counts$country_groups[total_counts$country== "AUT" & total_counts$year == 1998] <- "Tier1"
total_counts$country_groups[total_counts$country== "FIN" & total_counts$year == 1999] <- "Tier1"
total_counts$country_groups[total_counts$country== "FRA" & total_counts$year == 2000] <- "Tier1"
total_counts$country_groups[total_counts$country== "BEL" & total_counts$year == 2001] <- "Tier1"
total_counts$country_groups[total_counts$country== "DNK" & total_counts$year == 2002] <- "Tier1"
total_counts$country_groups[total_counts$country== "ITA" & total_counts$year == 2003] <- "Tier1"
total_counts$country_groups[total_counts$country== "NLD" & total_counts$year == 2004] <- "Tier1"
total_counts$country_groups[total_counts$country== "GBR" & total_counts$year == 2005] <- "Tier1"
total_counts$country_groups[total_counts$country== "FIN" & total_counts$year == 2006] <- "Tier1"
total_counts$country_groups[total_counts$country== "PRT" & total_counts$year == 2007] <- "Tier1"
total_counts$country_groups[total_counts$country== "FRA" & total_counts$year == 2008] <- "Tier1"
total_counts$country_groups[total_counts$country== "SWE" & total_counts$year == 2009] <- "Tier1"
total_counts$country_groups[total_counts$country== "BEL" & total_counts$year == 2010] <- "Tier1"


ungd_files$country_groups <- ifelse(ungd_files$Country %in% sids_countries, "SIDS", "none")
ungd_files$country_groups[ungd_files$Country %in% tier1_countries] <- "Tier1"
ungd_files$country_groups[ungd_files$Country %in% tier2_countries] <- "Tier2"


ungd_files$country_groups[ungd_files$Country== "BEL" & ungd_files$Year == 1970] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "ITA" & ungd_files$Year == 1971] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "NLD" & ungd_files$Year == 1972] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "DNK" & ungd_files$Year == 1973] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "FRA" & ungd_files$Year == 1974] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "ITA" & ungd_files$Year == 1975] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "NLD" & ungd_files$Year == 1976] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "BEL" & ungd_files$Year == 1977] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "DEU" & ungd_files$Year == 1978] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "IRL" & ungd_files$Year == 1979] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "LUX" & ungd_files$Year == 1980] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "GBR" & ungd_files$Year == 1981] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "DNK" & ungd_files$Year == 1982] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "GRC" & ungd_files$Year == 1983] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "IRL" & ungd_files$Year == 1984] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "LUX" & ungd_files$Year == 1985] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "GBR" & ungd_files$Year == 1986] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "DNK" & ungd_files$Year == 1987] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "GRC" & ungd_files$Year == 1988] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "FRA" & ungd_files$Year == 1989] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "ITA" & ungd_files$Year == 1990] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "NLD" & ungd_files$Year == 1991] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "GBR" & ungd_files$Year == 1992] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "BEL" & ungd_files$Year == 1993] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "DEU" & ungd_files$Year == 1994] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "ESP" & ungd_files$Year == 1995] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "IRL" & ungd_files$Year == 1996] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "LUX" & ungd_files$Year == 1997] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "AUT" & ungd_files$Year == 1998] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "FIN" & ungd_files$Year == 1999] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "FRA" & ungd_files$Year == 2000] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "BEL" & ungd_files$Year == 2001] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "DNK" & ungd_files$Year == 2002] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "ITA" & ungd_files$Year == 2003] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "NLD" & ungd_files$Year == 2004] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "GBR" & ungd_files$Year == 2005] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "FIN" & ungd_files$Year == 2006] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "PRT" & ungd_files$Year == 2007] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "FRA" & ungd_files$Year == 2008] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "SWE" & ungd_files$Year == 2009] <- "Tier1"
ungd_files$country_groups[ungd_files$Country== "BEL" & ungd_files$Year == 2010] <- "Tier1"

climate_speeches_groups <- total_counts %>% filter(climate_count>0) %>% group_by(year, country_groups) %>% tally(name = "climate_speeches")

health_speeches_groups <- total_counts %>% filter(health_count>0) %>% group_by(year, country_groups) %>% tally(name = "health_speeches")

intersection_speeches_groups <- total_counts %>% filter(intersection_count>0) %>% group_by(year, country_groups) %>% tally(name = "intersection_speeches")


total_speeches_groups <- ungd_files %>% 
  group_by(Year, country_groups) %>% tally(name = "total_speeches")

proportions_groups <- left_join(total_speeches_groups, health_speeches_groups, by = c("Year"="year", "country_groups")) %>% 
  left_join(., climate_speeches_groups, by = c("Year"="year", "country_groups")) %>% 
  left_join(., intersection_speeches_groups, by = c("Year"="year", "country_groups")) %>% 
  replace_na(list(health_speeches=0, climate_speeches=0, intersection_speeches=0))

proportions_groups$percent_int <- proportions_groups$intersection_speeches/proportions_groups$total_speeches*100

proportions_groups$percent_CC <- proportions_groups$climate_speeches/proportions_groups$total_speeches*100

proportions_groups$percent_PH <- proportions_groups$health_speeches/proportions_groups$total_speeches*100

proportions_groups <- proportions_groups %>% filter(country_groups!="none")

##Total count plots by country group

ggplot(proportions_groups, aes(x=Year, y=health_speeches, group=country_groups, linetype = country_groups, colour = country_groups)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Health") + 
  ylab("Total number of references per UNGD session") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("PH_total_by_country_group.pdf")
Saving 7.29 x 4.51 in image

ggplot(proportions_groups, aes(x=Year, y=climate_speeches, group=country_groups, linetype = country_groups, colour = country_groups)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Climate Change") + 
  ylab("Total number of references per UNGD session") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("CC_total_by_country_group.pdf")
Saving 7.29 x 4.51 in image

ggplot(proportions_groups, aes(x=Year, y=intersection_speeches, group=country_groups, linetype = country_groups, colour = country_groups)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Intersection") + 
  ylab("Total number of references per UNGD session") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("intersection_total_by_country_group.pdf")
Saving 7.29 x 4.51 in image

##Proportion plots by country group

ggplot(proportions_groups, aes(x=Year, y=percent_PH, group=country_groups, linetype = country_groups, colour = country_groups)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Discussion of Health") + 
  ylab("Proportion of Countries, %") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000,  2010, 2019))

  ggsave("PH_percent_country_group.pdf")
Saving 7.29 x 4.51 in image

ggplot(proportions_groups, aes(x=Year, y=percent_CC, group=country_groups, linetype = country_groups, colour = country_groups)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Discussion of Climate Change") + 
  ylab("Proportion of Countries, %") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("CC_percent_country_group.pdf")
Saving 7.29 x 4.51 in image

ggplot(proportions_groups, aes(x=Year, y=percent_int, group=country_groups, linetype = country_groups, colour = country_groups)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Discussion of intersection") + 
  ylab("Proportion of Countries, %") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("intersection_percent_country_group.pdf")
Saving 7.29 x 4.51 in image

#WHO regions

Total counts by WHO region

Using UN M49 Standard (Standard country or area codes for statistical use (M49)) we create regional and sub-regional groupings of countries. [https://unstats.un.org/unsd/methodology/m49/]

#loading WHO regions country identifiers and preprocessing
regions <- readr::read_csv("../UNSD - Methodology.csv")
Parsed with column specification:
cols(
  `Global Code` = col_double(),
  `Global Name` = col_character(),
  `Region Code` = col_double(),
  WHO = col_character(),
  `Region Name` = col_character(),
  `Sub-region Code` = col_double(),
  `Sub-region Name` = col_character(),
  `Intermediate Region Code` = col_double(),
  `Intermediate Region Name` = col_character(),
  `Country or Area` = col_character(),
  `M49 Code` = col_double(),
  `ISO-alpha3 Code` = col_character(),
  `Least Developed Countries (LDC)` = col_character(),
  `Land Locked Developing Countries (LLDC)` = col_character(),
  `Small Island Developing States (SIDS)` = col_character(),
  `Developed / Developing Countries` = col_character()
)
#UNGDC used YUG designation while WHO is using SRB
total_counts$country <- str_replace(total_counts$country, "YUG", "SRB")

#merging WHO designations with mention counts
regional_data <- inner_join(total_counts, regions, by = c("country" = "ISO-alpha3 Code"))

# total sum of mention counts by year and WHO region, with means
who_sum <- summarise(group_by(regional_data, year, WHO), 
                     who_int = sum(intersection_count), who_PH = sum(health_count), who_CC = sum(climate_count))
readr::write_csv(regional_data, "who_regions_data.csv")
readr::write_csv(who_sum, "figure58.csv")

Plot by region

ggplot(who_sum, aes(x=year, y=who_PH, group=WHO, linetype = WHO, colour = WHO)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Health") + 
  ylab("Total number of references per UNGD session") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("PH_total_by_who.pdf")
Saving 7.29 x 4.51 in image

ggplot(who_sum, aes(x=year, y=who_CC, group=WHO, linetype = WHO, colour = WHO)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Climate Change") + 
  ylab("Total number of references per UNGD session") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("CC_total_by_who.pdf")
Saving 7.29 x 4.51 in image

ggplot(who_sum, aes(x=year, y=who_int, group=WHO, linetype = WHO, colour = WHO)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Intersection") + 
  ylab("Total number of references per UNGD session") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("intersection_total_by_who.pdf")
Saving 7.29 x 4.51 in image

Proportion by WHO region

Data preparation


climate_speeches_who <- regional_data %>% filter(climate_count>0) %>% group_by(year, WHO) %>% tally(name = "climate_speeches")
health_speeches_who <- regional_data %>% filter(health_count>0) %>% group_by(year, WHO) %>% tally(name = "health_speeches")
intersection_speeches_who <- regional_data %>% filter(intersection_count>0) %>% group_by(year, WHO) %>% tally(name = "intersection_speeches")

#merging WHO designations with mention counts
ungd_files$Country <- str_replace(ungd_files$Country, "YUG", "SRB")

total_speeches_who <- inner_join(ungd_files, regions, by = c("Country" = "ISO-alpha3 Code")) %>% 
  group_by(Year, WHO) %>% tally(name = "total_speeches")

proportions_who <- left_join(total_speeches_who, health_speeches_who, by = c("Year"="year", "WHO")) %>% 
  left_join(., climate_speeches_who, by = c("Year"="year", "WHO")) %>% 
  left_join(., intersection_speeches_who, by = c("Year"="year", "WHO")) %>% 
  replace_na(list(health_speeches=0, climate_speeches=0, intersection_speeches=0))

proportions_who$percent_int <- proportions_who$intersection_speeches/proportions_who$total_speeches*100
proportions_who$percent_CC <- proportions_who$climate_speeches/proportions_who$total_speeches*100
proportions_who$percent_PH <- proportions_who$health_speeches/proportions_who$total_speeches*100
readr::write_csv(proportions_who, "figure56.csv")

Plotting

ggplot(proportions_who, aes(x=Year, y=percent_PH, group=WHO, linetype = WHO, colour = WHO)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Discussion of Health") + 
  ylab("Proportion of Countries, %") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("PH_percent_who.pdf")
Saving 7.29 x 4.51 in image

ggplot(proportions_who, aes(x=Year, y=percent_CC, group=WHO, linetype = WHO, colour = WHO)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
 ggtitle("Discussion of Climate Change") + 
  ylab("Proportion of Countries, %") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("CC_percent_who.pdf")
Saving 7.29 x 4.51 in image

ggplot(proportions_who, aes(x=Year, y=percent_int, group=WHO, linetype = WHO, colour = WHO)) +
    geom_line() +
  guides(colour=guide_legend(title=NULL), linetype = FALSE) +
 guides(linetype=guide_legend(title=NULL)) +
  theme_bw() +
  ggtitle("Discussion of Intersection") + 
  ylab("Proportion of countries, %") + xlab("Year") +
  theme(legend.position="bottom") +
  scale_x_continuous(limits=c(1970, 2019), breaks = c(1970, 1980, 1990, 2000, 2010, 2019))

  ggsave("intersection_percent_who.pdf")
Saving 7.29 x 4.51 in image

LS0tCnRpdGxlOiAiQ2xpbWF0ZSBDaGFuZ2UgYW5kIFB1YmxpYyBIZWFsdGgiCmF1dGhvcjoKLSBhZmZpbGlhdGlvbjogVW5pdmVyc2l0eSBvZiBCaXJtaW5naGFtCiAgZW1haWw6IG4uZGFzYW5kaUBiaGFtLmFjLnVrCiAgbmFtZTogTmloZWVyIERhc2FuZGkKLSBhZmZpbGlhdGlvbjogSGVydGllIFNjaG9vbAogIGVtYWlsOiBqYW5raW5AaGVydGllLXNjaG9vbC5vcmcKICBuYW1lOiBTbGF2YSBKYW5raW4gTWlraGF5bG92CmRhdGU6IDE1IE1hcmNoIDIwMjAKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKICB3b3JkX2RvY3VtZW50OiAKICAgIHRvYzogeWVzCiNiaWJsaW8tc3R5bGU6IGFwc3IKI2JpYmxpb2dyYXBoeTogZXUuYmliCiN0aGFua3M6IFdlIHRoYW5rIFRydW1wIEFkbWluaXN0cmF0aW9uIGZvciB0aGVpciBnZW5lcm91cyBzdXBwb3J0IG9mIGNsaW1hdGUgY2hhbmdlIGluaXRpYXRpdmVzLgphYnN0cmFjdDogV2UgbG9vayBhdCB0aGUgbGluayBiZXR3ZWVuIHB1YmxpYyBoZWFsdGggaXNzdWVzIGFuZCBjbGltYXRlIGNoYW5nZSBkaXNjdXNzZWQgaW4gdGhlIFVOIEdlbmVyYWwgRGViYXRlcy4KCi0tLQoKCgojRGF0YQoKTG9hZGluZyBkYXRhIGZyb20gdGhlIFVOR0RDIGRhdGEKCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQojTG9hZGluZyBwYWNrYWdlcyBhbmQgZGF0YQpsaWJyYXJ5KHJlYWR0ZXh0KQpsaWJyYXJ5KHF1YW50ZWRhKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyd29ybGRtYXApCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KGhhdmVuKQpsaWJyYXJ5KHJlYWR4bCkKYGBgCgpgYGB7cn0KCkRBVEFfRElSIDwtICJ+L0Ryb3Bib3gvUmVzZWFyY2gvVU5HREMgcHJvamVjdHMvVU4gRGF0YS8iIAoKdW5nZF9maWxlcyA8LSByZWFkdGV4dChwYXN0ZTAoREFUQV9ESVIsICJUWFQvKiIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdmFyc2Zyb20gPSAiZmlsZW5hbWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2c2VwPSJfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3Zhcm5hbWVzID0gYygiQ291bnRyeSIsICJTZXNzaW9uIiwgIlllYXIiKSkKCgp1bmdkX2ZpbGVzJGRvY19pZCA8LSBzdHJfcmVwbGFjZSh1bmdkX2ZpbGVzJGRvY19pZCAsICIudHh0IiwgIiIpICU+JQogICBzdHJfcmVwbGFjZSguICwgIl9cXGR7Mn0iLCAiIikKCmBgYAoKCiMjQ3JlYXRpbmcgY29ycHVzIG9iamVjdChzKQpgYGB7cn0KdW5nZF9jb3JwdXMgPC0gY29ycHVzKHVuZ2RfZmlsZXMsIHRleHRfZmllbGQgPSAidGV4dCIpIAoKdW5nZGMuMjAxOSA8LSBjb3JwdXNfc3Vic2V0KHVuZ2RfY29ycHVzLCBZZWFyPT0yMDE5KQoKYGBgCgoKCmBgYHtyfQoKY29ycF9zdW1tYXJ5IDwtIHN1bW1hcmlzZShncm91cF9ieShzdW1tYXJ5KHVuZ2RfY29ycHVzLCBuID0gOTM0OSksWWVhciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3NwZWVjaGVzPW4oKSx0b3RhbF9zZW50ZW5jZXM9c3VtKFNlbnRlbmNlcyksdG90YWxfd29yZHM9c3VtKFRva2VucykpCgpyZWFkcjo6d3JpdGVfY3N2KGNvcnBfc3VtbWFyeSwgImNvcnBfc3VtbWFyeS5jc3YiKQoKYGBgCgoKCgojUHJlLXByb2Nlc3NpbmcKClRva2VuaXppbmcgY29ycHVzLgoKYGBge3J9CiNUb2tlbml6YXRpb24gYW5kIGJhc2ljIHByZS1wcm9jZXNzaW5nCnRvayA8LSB0b2tlbnModW5nZF9jb3JwdXMsIHdoYXQgPSAid29yZCIsCiAgICAgICAgICAgICAgcmVtb3ZlX3B1bmN0ID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVfc3ltYm9scyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlX251bWJlcnMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZV91cmwgPSBUUlVFLAogICAgICAgICAgICAgIHNwbGl0X2h5cGhlbnMgPSBGQUxTRSwKICAgICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkKYGBgCgpMb3dlcmNhc2luZyBhbmQgcmVtb3Zpbmcgc3RvcHdvcmRzCgpgYGB7cn0KdG9rIDwtIHRva2Vuc190b2xvd2VyKHRvaykKdG9rLnIgPC0gdG9rZW5zX3NlbGVjdCh0b2ssIHN0b3B3b3JkcygiZW5nbGlzaCIpLCBzZWxlY3Rpb24gPSAicmVtb3ZlIiwgcGFkZGluZyA9IEZBTFNFKQoKYGBgCgojU2V0dGluZyB1cCBhZ3JlZWQgZGljdGlvbmFyaWVzCgpDcmVhdGluZyBjb21wb3VuZCB0b2tlbnMgZnJvbSB0aGUga2V5IHRlcm1zIChwaHJhc2VzKSBpbiBvdXIgZGljdGlvbmFyaWVzOgogCmBgYHtyfQoKbXlsaXN0IDwtIGxpc3QoIGMoImFpciIsICJwb2xsdXRpb24iKSwgYygibWVudGFsIiwgImRpc29yZGVyIiksIGMoIm1lbnRhbCIsICJkaXNvcmRlcnMiKSwgYygiY2xpbWF0ZSIsImNoYW5nZSIpLCBjKCJjaGFuZ2luZyIsImNsaW1hdGUiKSwgYygiY2xpbWF0ZSIsImVtZXJnZW5jeSIpLCBjKCJjbGltYXRlIiwiY3Jpc2lzIiksIGMoImNsaW1hdGUiLCJkZWNheSIpLCBjKCJnbG9iYWwiLCJ3YXJtaW5nIiksIGMoImdyZWVuIiwiaG91c2UiKSwgYygiZXh0cmVtZSIsIndlYXRoZXIiKSwgYygiZ2xvYmFsIiwgImVudmlyb25tZW50YWwiLCAiY2hhbmdlIiksIGMoImNsaW1hdGUiLCJ2YXJpYWJpbGl0eSIpLCAgYygibG93IiwiY2FyYm9uIiksIGMoInJlbmV3YWJsZSIsImVuZXJneSIpLCBjKCJjYXJib24iLCJlbWlzc2lvbiIpLCBjKCJjYXJib24iLCJlbWlzc2lvbnMiKSwgYygiY2FyYm9uIiwiZGlveGlkZSIpLCBjKCJjbzIiLCJlbWlzc2lvbiIpLCBjKCJjbzIiLCJlbWlzc2lvbnMiKSwgYygiY2xpbWF0ZSIsInBvbGx1dGFudCIpLCBjKCJjbGltYXRlIiwicG9sbHV0YW50cyIpLCBjKCJjYXJib24iLCJuZXV0cmFsIiksIGMoImNhcmJvbiIsIm5ldXRyYWxpdHkiKSwgYygiY2xpbWF0ZSIsIm5ldXRyYWxpdHkiKSwgYygiY2xpbWF0ZSIsImFjdGlvbiIpLCBjKCJuZXQiLCJ6ZXJvIikpIAogCmBgYAogCgpgYGB7cn0KdG9rLmNvbXBvdW5kIDwtIHRva2Vuc19jb21wb3VuZCh0b2suciwgbXlsaXN0LCB2YWx1ZXR5cGUgPSAiZml4ZWQiLCBjb25jYXRlbmF0b3IgPSAiXyIpCmBgYAoKCkNyZWF0aW5nIHRoZSBkaWN0aW9uYXJ5IG9mIGNsaW1hdGUgY2hhbmdlIHRlcm1zOgoKYGBge3J9CmNsaW1hdGVfZGljdCA8LSBkaWN0aW9uYXJ5KGxpc3QoY2xpbWF0ZSA9ICBjKCJjbGltYXRlX2NoYW5nZSIsICJjaGFuZ2luZ19jbGltYXRlIiwgImNsaW1hdGVfZW1lcmdlbmN5IiwgImNsaW1hdGVfY3Jpc2lzIiwgImNsaW1hdGVfZGVjYXkiLCAiZ2xvYmFsX3dhcm1pbmciLCAiZ3JlZW5faG91c2UiLCAidGVtcGVyYXR1cmUiLCAiZXh0cmVtZV93ZWF0aGVyIiwgImdsb2JhbF9lbnZpcm9ubWVudGFsX2NoYW5nZSIsICJjbGltYXRlX3ZhcmlhYmlsaXR5IiwgImdyZWVuaG91c2UiLCAiZ3JlZW5ob3VzZS1nYXMiLCAibG93X2NhcmJvbiIsICJnaGdlIiwgImdoZ2VzIiwgInJlbmV3YWJsZV9lbmVyZ3kiLCAiY2FyYm9uX2VtaXNzaW9uIiwgImNhcmJvbl9lbWlzc2lvbnMiLCAiY2FyYm9uX2Rpb3hpZGUiLCAiY2FyYm9uLWRpb3hpZGUiLCAiY28yX2VtaXNzaW9uIiwgImNvMl9lbWlzc2lvbnMiLCAiY2xpbWF0ZV9wb2xsdXRhbnQiLCAiY2xpbWF0ZV9wb2xsdXRhbnRzIiwgImRlY2FyYm9uaXphdGlvbiIsICJkZWNhcmJvbmlzYXRpb24iLCAiY2FyYm9uX25ldXRyYWwiLCAiY2FyYm9uLW5ldXRyYWwiLCAiY2FyYm9uX25ldXRyYWxpdHkiLCAiY2xpbWF0ZV9uZXV0cmFsaXR5IiwgImNsaW1hdGVfYWN0aW9uIiwgIm5ldC16ZXJvIiwgIm5ldF96ZXJvIgopKSkKCmBgYAoKQ3JlYXRpbmcgdGhlIGRpY3Rpb25hcnkgb2YgaGVhbHRoIHRlcm1zOgoKYGBge3J9CmhlYWx0aF9kaWN0IDwtIGRpY3Rpb25hcnkobGlzdChoZWFsdGggPSBjKCJtYWxhcmlhIiwgImRpYXJyaG9lYSIsICJpbmZlY3Rpb24iLCAiZGlzZWFzZSIsICJkaXNlYXNlcyIsICJzYXJzIiwgIm1lYXNsZXMiLCAicG5ldW1vbmlhIiwgImVwaWRlbWljIiwgImVwaWRlbWljcyIsICJwYW5kZW1pYyIsICJwYW5kZW1pY3MiLCAiZXBpZGVtaW9sb2d5IiwgImhlYWx0aGNhcmUiLCAiaGVhbHRoIiwgIm1vcnRhbGl0eSIsICJtb3JiaWRpdHkiLCAibnV0cml0aW9uIiwgImlsbG5lc3MiLCAiaWxsbmVzc2VzIiwgIm5jZCIsICJuY2RzIiwgImFpcl9wb2xsdXRpb24iLCAibnV0cml0aW9uIiwgIm1hbG51dHJpdGlvbiIsICJtYWxub3VyaXNobWVudCIsICJtZW50YWxfZGlzb3JkZXIiLCAibWVudGFsX2Rpc29yZGVycyIsICJzdHVudGluZyIpKSkKYGBgCgoKCiMjIEtXSUMKClBlcmZvcm1pbmcgYSBrZXl3b3JkLWluLWNvbnRleHQgc2VhcmNoLiBUaGUgd2luZG93IGlzIHNldCB0byAyNSB3b3JkcyBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0ZXJtIC0gcmVmbGVjdGluZyBhcHByb3hpbWF0ZWx5IGhhbGYgYSBwYXJhZ3JhcGggYmVmb3JlIGFuZCBhZnRlciB0aGUgdGVybSAob24gYXZlcmFnZSBhIHBhcmFncmFwaCBpbiBFbmdsaXNoIGlzIDUwIHdvcmRzKS4gVU5HRCBzcGVlY2hlcyBhcmUgaGlnaGx5IHN0cnVjdHVyZWQgZG9jdW1lbnRzIGRyYWZ0ZWQgb3ZlciBsb25nIHBlcmlvZHMgb2YgdGltZSBhbmQgcmVmbGVjdCBpbnRlcm5hbCBkaXNjdXNzaW9ucyBhbmQgbmVnb3RpYXRpb25zIGluIGdvdmVybm1lbnQuIEhlbmNlIHdlIGFzc3VtZSB0aGF0IHRlcm1zIGFwcGVhcmluZyB3aXRoaW4gc3BlY2lmaWMgcHJveGltaXR5IG9mIGVhY2ggb3RoZXIgYXJlIHJlbGF0ZWQgdGhyb3VnaCB0aGUgc3RydWN0dXJlZCBwcm9jZXNzIG9mIGRvY3VtZW50IGdlbmVyYXRpb24uCgpXZSBzZWFyY2ggZm9yIHRlcm1zIGZyb20gb3VyIGhlYWx0aCBkaWN0aW9uYXJ5IGFuZCBzaG93IHRoZSAyNS13b3JkIGNvbnRleHQgYXJvdW5kIHRoZW0uIAoKYGBge3J9CnRvay5oZWEgPC0ga3dpYyh0b2suY29tcG91bmQsIGhlYWx0aF9kaWN0LCB3aW5kb3cgPSAyNSwgdmFsdWV0eXBlID0gImZpeGVkIikKCnJlYWRyOjp3cml0ZV9jc3YodG9rLmhlYSwgImhlYWx0aF9rd2ljXzI1X2ZpeGVkLmNzdiIpCgpgYGAKCldlIHNlYXJjaCBmb3IgdGVybXMgZnJvbSBvdXIgY2xpbWF0ZSBjaGFuZ2UgZGljdGlvbmFyeSBhbmQgc2hvdyB0aGUgMjUtd29yZCBjb250ZXh0IGFyb3VuZCB0aGVtLiAKCmBgYHtyfQp0b2suY2MgPC0ga3dpYyh0b2suY29tcG91bmQsIGNsaW1hdGVfZGljdCwgd2luZG93ID0gMjUsIHZhbHVldHlwZSA9ICJmaXhlZCIpCgpyZWFkcjo6d3JpdGVfY3N2KHRvay5jYywgImNsaW1hdGVfa3dpY18yNV9maXhlZC5jc3YiKQoKYGBgCgpUbyB0YXAgaW50byB0aGUgY29yZSBwcm9wb3NpdGlvbiBvZiB0aGlzIGFuYWx5c2lzIC0gdGhlIGxpbmsgYmV0d2VlbiBjbGltYXRlIGNoYW5nZSBhbmQgaGVhbHRoIHRlcm1zIC0gd2UgdGFrZSB0aGUgMjUtd29yZCBjb250ZXh0IGFyb3VuZCB0aGUgaGVhbHRoIHRlcm1zIGFuZCBzZWFyY2ggdGhpcyBjb250ZXh0IGZvciBjbGltYXRlIGNoYW5nZSB0ZXJtcy4gCgpUZXh0IHN1cnJvdW5kaW5nIGhlYWx0aCB0ZXJtcyAoMjUgd29yZHMgZWFjaCBzaWRlKSBpcyBzYXZlZCBhbmQgdHJhbnNmb3JtZWQgdG8gYSBjb3JwdXMgb2JqZWN0LiBXZSB0aGVuIHBlcmZvcm0ga2V5LXdvcmQtaW4tY29udGV4dCBzZWFyY2ggb2YgdGhpcyBoZWFsdGggcmVsYXRlZCBjb3JwdXMgZm9yIHRoZSB0ZXJtcyBpbiBvdXIgY2xpbWF0ZSBjaGFuZ2UgZGljdGlvbmFyeS4gCgpgYGB7cn0KY29ycHVzX2hlYWx0aCA8LSBjb3JwdXModG9rLmhlYSwgc3BsaXRfY29udGV4dCA9IEZBTFNFLCBleHRyYWN0X2tleXdvcmQgPSBUUlVFKQoKdG9rLmNsaW1hdGUua3dpYyA8LSBrd2ljKGNvcnB1c19oZWFsdGgsIGNsaW1hdGVfZGljdCwgd2luZG93ID0gMjUsIHZhbHVldHlwZSA9ICJmaXhlZCIpCgpyZWFkcjo6d3JpdGVfY3N2KHRvay5jbGltYXRlLmt3aWMsICJpbnRlcnNlY3Rpb25fa3dpY18yNV9maXhlZC5jc3YiKQoKYGBgCgoKIyMjIFJvYnVzdG5lc3MgYW5hbHlzaXMKCkZvciByb2J1c3RuZXNzIGFuYWx5c2lzIHdlIGxvb2tlZCBhdCBkaWZmZXJlbnQgY29udGV4dCB3aW5kb3cgc2l6ZXMgYW5kIG1hbnVhbGx5IGFzc2Vzc2VkIHRoZW0gZm9yIHRoZSBiYWxhbmNlIG9mIGZhbHNlIHBvc2l0aXZlcyB2cyBmYWxzZSBuZWdhdGl2ZXMuCgpgYGB7cn0KdG9rLmhlYS41IDwtIGt3aWModG9rLmNvbXBvdW5kLCBoZWFsdGhfZGljdCwgd2luZG93ID0gNSwgdmFsdWV0eXBlID0gImZpeGVkIikKdG9rLmNjLjUgPC0ga3dpYyh0b2suY29tcG91bmQsIGNsaW1hdGVfZGljdCwgd2luZG93ID0gNSwgdmFsdWV0eXBlID0gImZpeGVkIikKY29ycHVzX2hlYWx0aC41IDwtIGNvcnB1cyh0b2suaGVhLjUsIHNwbGl0X2NvbnRleHQgPSBGQUxTRSwgZXh0cmFjdF9rZXl3b3JkID0gVFJVRSkKdG9rLmNsaW1hdGUua3dpYy41IDwtIGt3aWMoY29ycHVzX2hlYWx0aC41LCBjbGltYXRlX2RpY3QsIHdpbmRvdyA9IDUsIHZhbHVldHlwZSA9ICJmaXhlZCIpCnJlYWRyOjp3cml0ZV9jc3YodG9rLmNsaW1hdGUua3dpYy41LCAiaW50ZXJzZWN0aW9uX2t3aWNfNV9maXhlZC5jc3YiKQpyZWFkcjo6d3JpdGVfY3N2KHRvay5oZWEuNSwgImhlYWx0aF9rd2ljXzVfZml4ZWQuY3N2IikKcmVhZHI6OndyaXRlX2Nzdih0b2suY2MuNSwgImNsaW1hdGVfa3dpY181X2ZpeGVkLmNzdiIpCgp0b2suaGVhLjEwIDwtIGt3aWModG9rLmNvbXBvdW5kLCBoZWFsdGhfZGljdCwgd2luZG93ID0gMTAsIHZhbHVldHlwZSA9ICJmaXhlZCIpCnRvay5jYy4xMCA8LSBrd2ljKHRvay5jb21wb3VuZCwgY2xpbWF0ZV9kaWN0LCB3aW5kb3cgPSAxMCwgdmFsdWV0eXBlID0gImZpeGVkIikKY29ycHVzX2hlYWx0aC4xMCA8LSBjb3JwdXModG9rLmhlYS4xMCwgc3BsaXRfY29udGV4dCA9IEZBTFNFLCBleHRyYWN0X2tleXdvcmQgPSBUUlVFKQp0b2suY2xpbWF0ZS5rd2ljLjEwIDwtIGt3aWMoY29ycHVzX2hlYWx0aC4xMCwgY2xpbWF0ZV9kaWN0LCB3aW5kb3cgPSAxMCwgdmFsdWV0eXBlID0gImZpeGVkIikKcmVhZHI6OndyaXRlX2Nzdih0b2suY2xpbWF0ZS5rd2ljLjEwLCAiaW50ZXJzZWN0aW9uX2t3aWNfMTBfZml4ZWQuY3N2IikKcmVhZHI6OndyaXRlX2Nzdih0b2suaGVhLjEwLCAiaGVhbHRoX2t3aWNfMTBfZml4ZWQuY3N2IikKcmVhZHI6OndyaXRlX2Nzdih0b2suY2MuMTAsICJjbGltYXRlX2t3aWNfMTBfZml4ZWQuY3N2IikKCnRvay5oZWEuMzAgPC0ga3dpYyh0b2suY29tcG91bmQsIGhlYWx0aF9kaWN0LCB3aW5kb3cgPSAzMCwgdmFsdWV0eXBlID0gImZpeGVkIikKdG9rLmNjLjMwIDwtIGt3aWModG9rLmNvbXBvdW5kLCBjbGltYXRlX2RpY3QsIHdpbmRvdyA9IDMwLCB2YWx1ZXR5cGUgPSAiZml4ZWQiKQpjb3JwdXNfaGVhbHRoLjMwIDwtIGNvcnB1cyh0b2suaGVhLjMwLCBzcGxpdF9jb250ZXh0ID0gRkFMU0UsIGV4dHJhY3Rfa2V5d29yZCA9IFRSVUUpCnRvay5jbGltYXRlLmt3aWMuMzAgPC0ga3dpYyhjb3JwdXNfaGVhbHRoLjMwLCBjbGltYXRlX2RpY3QsIHdpbmRvdyA9IDMwLCB2YWx1ZXR5cGUgPSAiZml4ZWQiKQpyZWFkcjo6d3JpdGVfY3N2KHRvay5jbGltYXRlLmt3aWMuMzAsICJpbnRlcnNlY3Rpb25fa3dpY18zMF9maXhlZC5jc3YiKQpyZWFkcjo6d3JpdGVfY3N2KHRvay5oZWEuMzAsICJoZWFsdGhfa3dpY18zMF9maXhlZC5jc3YiKQpyZWFkcjo6d3JpdGVfY3N2KHRvay5jYy4zMCwgImNsaW1hdGVfa3dpY18zMF9maXhlZC5jc3YiKQoKdG9rLmhlYS41MCA8LSBrd2ljKHRvay5jb21wb3VuZCwgaGVhbHRoX2RpY3QsIHdpbmRvdyA9IDUwLCB2YWx1ZXR5cGUgPSAiZml4ZWQiKQp0b2suY2MuNTAgPC0ga3dpYyh0b2suY29tcG91bmQsIGNsaW1hdGVfZGljdCwgd2luZG93ID0gNTAsIHZhbHVldHlwZSA9ICJmaXhlZCIpCmNvcnB1c19oZWFsdGguNTAgPC0gY29ycHVzKHRvay5oZWEuNTAsIHNwbGl0X2NvbnRleHQgPSBGQUxTRSwgZXh0cmFjdF9rZXl3b3JkID0gVFJVRSkKdG9rLmNsaW1hdGUua3dpYy41MCA8LSBrd2ljKGNvcnB1c19oZWFsdGguNTAsIGNsaW1hdGVfZGljdCwgd2luZG93ID0gNTAsIHZhbHVldHlwZSA9ICJmaXhlZCIpCnJlYWRyOjp3cml0ZV9jc3YodG9rLmNsaW1hdGUua3dpYy41MCwgImludGVyc2VjdGlvbl9rd2ljXzUwX2ZpeGVkLmNzdiIpCnJlYWRyOjp3cml0ZV9jc3YodG9rLmhlYS41MCwgImhlYWx0aF9rd2ljXzUwX2ZpeGVkLmNzdiIpCnJlYWRyOjp3cml0ZV9jc3YodG9rLmNjLjUwLCAiY2xpbWF0ZV9rd2ljXzUwX2ZpeGVkLmNzdiIpCgpgYGAKCgoKCgpgYGB7cn0KaGVhbHRoX2RmbSA8LSBkZm0oY29ycHVzX2hlYWx0aCkKCmNvcnB1c19jbGltYXRlIDwtIGNvcnB1cyh0b2suY2MsIHNwbGl0X2NvbnRleHQgPSBGQUxTRSwgZXh0cmFjdF9rZXl3b3JkID0gVFJVRSkKY2xpbWF0ZV9kZm0gPC0gZGZtKGNvcnB1c19jbGltYXRlKQoKY29ycHVzX2ludGVyc2VjdGlvbiA8LSBjb3JwdXModG9rLmNsaW1hdGUua3dpYywgc3BsaXRfY29udGV4dCA9IEZBTFNFLCBleHRyYWN0X2tleXdvcmQgPSBUUlVFKQppbnRlcnNlY3Rpb25fZGZtIDwtIGRmbShjb3JwdXNfaW50ZXJzZWN0aW9uKQoKaGVhbHRoIDwtIGNvbnZlcnQoaGVhbHRoX2RmbSwgImRhdGEuZnJhbWUiKQpjbGltYXRlIDwtIGNvbnZlcnQoY2xpbWF0ZV9kZm0sICJkYXRhLmZyYW1lIikKaW50ZXJzZWN0aW9uIDwtIGNvbnZlcnQoaW50ZXJzZWN0aW9uX2RmbSwgImRhdGEuZnJhbWUiKQoKbmFtZXMoaGVhbHRoKVsxXSA8LSAiZG9jaWQiCm5hbWVzKGNsaW1hdGUpWzFdIDwtICJkb2NpZCIKbmFtZXMoaW50ZXJzZWN0aW9uKVsxXSA8LSAiZG9jaWQiCgpoZWFsdGgkImRvY2lkIiA8LSBzdHJfZXh0cmFjdChoZWFsdGgkZG9jaWQsICJeKFteLl0rKSIpCmNsaW1hdGUkImRvY2lkIiA8LSBzdHJfZXh0cmFjdChjbGltYXRlJGRvY2lkLCAiXihbXi5dKykiKQppbnRlcnNlY3Rpb24kImRvY2lkIiA8LSBzdHJfZXh0cmFjdChpbnRlcnNlY3Rpb24kZG9jaWQsICJeKFteLl0rKSIpCgpoZWFsdGhfY291bnRzIDwtIGhlYWx0aCAlPiUgZ3JvdXBfYnkoZG9jaWQpICU+JSBzdW1tYXJpc2UoaGVhbHRoX2NvdW50ID0gbigpKQpjbGltYXRlX2NvdW50cyA8LSBjbGltYXRlICU+JSBncm91cF9ieShkb2NpZCkgJT4lIHN1bW1hcmlzZShjbGltYXRlX2NvdW50ID0gbigpKQppbnRlcnNlY3Rpb25fY291bnRzIDwtIGludGVyc2VjdGlvbiAlPiUgZ3JvdXBfYnkoZG9jaWQpICU+JSBzdW1tYXJpc2UoaW50ZXJzZWN0aW9uX2NvdW50ID0gbigpKQoKdG90YWxfY291bnRzIDwtIGNsaW1hdGVfY291bnRzICU+JSAKICBmdWxsX2pvaW4oaGVhbHRoX2NvdW50cywgYnkgPSAiZG9jaWQiKSAlPiUgCiAgZnVsbF9qb2luKGludGVyc2VjdGlvbl9jb3VudHMsIGJ5ID0gImRvY2lkIikgJT4lCiAgcmVwbGFjZV9uYShsaXN0KGhlYWx0aF9jb3VudD0wLCBjbGltYXRlX2NvdW50PTAsIGludGVyc2VjdGlvbl9jb3VudD0wKSkgJT4lCiAgc2VwYXJhdGUoZG9jaWQsIGMoImNvdW50cnkiLCAieWVhciIpLCAiXyIpCgp0b3RhbF9jb3VudHMkeWVhciA8LSBhcy5udW1lcmljKHRvdGFsX2NvdW50cyR5ZWFyKQoKdG90YWxfY291bnRzIDwtIGFycmFuZ2UodG90YWxfY291bnRzLCBjb3VudHJ5LCB5ZWFyKQoKYGBgCgoKYGBge3J9CnJlYWRyOjp3cml0ZV9jc3YodG90YWxfY291bnRzLCAidG90YWxfY291bnRzLmNzdiIpCmBgYAoKCgoKCiMgTWFwcyBvZiBtZW50aW9uIGNvdW50cwoKCiMjIE1hcCBmb3IgMjAxOSBvZiBQSCBhbmQgQ0MKCktlZXBpbmcgb25seSBjb3VudHJ5LXllYXJzIHdpdGggYXQgbGVhc3Qgb25lIG1lbnRpb24gb2YgQ0MgaW4gUEggY29uZXh0CgoKYGBge3J9CgptYXAgPC0gam9pbkNvdW50cnlEYXRhMk1hcChzdWJzZXQodG90YWxfY291bnRzLCB5ZWFyPT0yMDE5ICYgaGVhbHRoX2NvdW50PjApLCBqb2luQ29kZT0iSVNPMyIsIG5hbWVKb2luQ29sdW1uPSJjb3VudHJ5IikKCm5ld193b3JsZCA8LSBzdWJzZXQobWFwLCBjb250aW5lbnQgIT0gIkFudGFyY3RpY2EiKQoKcGRmKCJ3b3JsZG1hcF8yMDE5X2hlYWx0aC5wZGYiLCB3aWR0aCA9IDcsIGhlaWdodCA9IDMpCgpwYXIobWFpPWMoMCwwLDAuMiwwKSx4YXhzPSJpIix5YXhzPSJpIikKCm1hcFBhcmFtcyA8LSBtYXBDb3VudHJ5RGF0YShuZXdfd29ybGQsIG5hbWVDb2x1bW5Ub1Bsb3Q9ImhlYWx0aF9jb3VudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVGl0bGU9IjIwMTkgVU4gR2VuZXJhbCBEZWJhdGU6IEhlYWx0aCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0TWV0aG9kID0gImNhdGVnb3JpY2FsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXJQYWxldHRlID0gImhlYXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jZWFuQ29sID0gImxpZ2h0Ymx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ0NvdW50cnlDb2wgPSAid2hpdGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExlZ2VuZD0iRkFMU0UiKQoKZG8uY2FsbCggYWRkTWFwTGVnZW5kQm94ZXMsIGMobWFwUGFyYW1zLHRpdGxlPSJOdW1iZXIgb2YgbWVudGlvbnMiLHggPSAiYm90dG9tIiwgaG9yaXo9VFJVRSwgY2V4PTAuNSkpCgpkZXYub2ZmKCkKYGBgCgoKYGBge3J9CgptYXAgPC0gam9pbkNvdW50cnlEYXRhMk1hcChzdWJzZXQodG90YWxfY291bnRzLCB5ZWFyPT0yMDE5ICYgY2xpbWF0ZV9jb3VudD4wKSwgam9pbkNvZGU9IklTTzMiLCBuYW1lSm9pbkNvbHVtbj0iY291bnRyeSIpCgpuZXdfd29ybGQgPC0gc3Vic2V0KG1hcCwgY29udGluZW50ICE9ICJBbnRhcmN0aWNhIikKCnBkZigid29ybGRtYXBfMjAxOV9jbGltYXRlLnBkZiIsIHdpZHRoID0gNywgaGVpZ2h0ID0gMykKCnBhcihtYWk9YygwLDAsMC4yLDApLHhheHM9ImkiLHlheHM9ImkiKQoKbWFwUGFyYW1zIDwtIG1hcENvdW50cnlEYXRhKG5ld193b3JsZCwgbmFtZUNvbHVtblRvUGxvdD0iY2xpbWF0ZV9jb3VudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVGl0bGU9IjIwMTkgVU4gR2VuZXJhbCBEZWJhdGU6IENsaW1hdGUgQ2hhbmdlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRNZXRob2QgPSAiY2F0ZWdvcmljYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91clBhbGV0dGUgPSAiaGVhdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NlYW5Db2wgPSAibGlnaHRibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nQ291bnRyeUNvbCA9ICJ3aGl0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGVnZW5kPSJGQUxTRSIpCgpkby5jYWxsKCBhZGRNYXBMZWdlbmRCb3hlcywgYyhtYXBQYXJhbXMsdGl0bGU9Ik51bWJlciBvZiBtZW50aW9ucyIseCA9ICJib3R0b20iLCBob3Jpej1UUlVFLCBjZXg9MC41KSkKCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KCm1hcCA8LSBqb2luQ291bnRyeURhdGEyTWFwKHN1YnNldCh0b3RhbF9jb3VudHMsIHllYXI9PTIwMTkgJiBpbnRlcnNlY3Rpb25fY291bnQ+MCksIGpvaW5Db2RlPSJJU08zIiwgbmFtZUpvaW5Db2x1bW49ImNvdW50cnkiKQoKbmV3X3dvcmxkIDwtIHN1YnNldChtYXAsIGNvbnRpbmVudCAhPSAiQW50YXJjdGljYSIpCgpwZGYoIndvcmxkbWFwXzIwMTlfaW50ZXJzZWN0aW9uLnBkZiIsIHdpZHRoID0gNywgaGVpZ2h0ID0gMykKCnBhcihtYWk9YygwLDAsMC4yLDApLHhheHM9ImkiLHlheHM9ImkiKQoKbWFwUGFyYW1zIDwtIG1hcENvdW50cnlEYXRhKG5ld193b3JsZCwgbmFtZUNvbHVtblRvUGxvdD0iaW50ZXJzZWN0aW9uX2NvdW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBUaXRsZT0iMjAxOSBVTiBHZW5lcmFsIERlYmF0ZTogSW50ZXJzZWN0aW9uIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRNZXRob2QgPSAiY2F0ZWdvcmljYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91clBhbGV0dGUgPSAiaGVhdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NlYW5Db2wgPSAibGlnaHRibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nQ291bnRyeUNvbCA9ICJ3aGl0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGVnZW5kPSJGQUxTRSIpCgpkby5jYWxsKCBhZGRNYXBMZWdlbmRCb3hlcywgYyhtYXBQYXJhbXMsdGl0bGU9Ik51bWJlciBvZiBtZW50aW9ucyIseCA9ICJib3R0b20iLCBob3Jpej1UUlVFLCBjZXg9MC41KSkKCmRldi5vZmYoKQpgYGAKCgojIENvdW50cnkgcGxvdHMKCiMjVVNBCgpgYGB7cn0KCnRvdGFsX2NvdW50cyA8LSB0b3RhbF9jb3VudHMgJT4lIGFkZF9yb3coY291bnRyeSA9ICJVU0EiLCB5ZWFyID0gMjAxOCwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkKdG90YWxfY291bnRzIDwtIHRvdGFsX2NvdW50cyAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIlVTQSIsIHllYXIgPSAyMDE5LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKQoKZ2dwbG90KHN1YnNldCh0b3RhbF9jb3VudHMsIGNvdW50cnk9PSJVU0EiKSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IGhlYWx0aF9jb3VudCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gY2xpbWF0ZV9jb3VudCksIGNvbG91ciA9ICJkYXJrZ3JlZW4iLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGludGVyc2VjdGlvbl9jb3VudCksIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IDAuOSkgKwogIGdndGl0bGUoIlVTQSIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50X1VTQS5wZGYiKQpgYGAKCgoKIyNHQlIKCmBgYHtyfQoKdG90YWxfY291bnRzIDwtIHRvdGFsX2NvdW50cyAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkdCUiIsIHllYXIgPSAxOTcwLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkdCUiIsIHllYXIgPSAxOTcxLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKQoKZ2dwbG90KHN1YnNldCh0b3RhbF9jb3VudHMsIGNvdW50cnk9PSJHQlIiKSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IGhlYWx0aF9jb3VudCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gY2xpbWF0ZV9jb3VudCksIGNvbG91ciA9ICJkYXJrZ3JlZW4iLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGludGVyc2VjdGlvbl9jb3VudCksIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IDAuOSkgKwogIGdndGl0bGUoIlVLIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkKCmdnc2F2ZSgidGltZXNlcmllc19hbGxfdG90YWxfY291bnRfR0JSLnBkZiIpCmBgYAoKIyNHZXJtYW55CmBgYHtyfQoKdG90YWxfY291bnRzIDwtIHRvdGFsX2NvdW50cyAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTcwLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTcxLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTcyLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTczLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTc0LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTc1LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTc2LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkRFVSIsIHllYXIgPSAxOTc3LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKQoKCmdncGxvdChzdWJzZXQodG90YWxfY291bnRzLCBjb3VudHJ5PT0iREVVIiksIGFlcyh4PXllYXIpKSArCiAgdGhlbWVfYncoKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBoZWFsdGhfY291bnQpLCBjb2xvdXIgPSAiYmx1ZSIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZG90ZGFzaCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGNsaW1hdGVfY291bnQpLCBjb2xvdXIgPSAiZGFya2dyZWVuIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBpbnRlcnNlY3Rpb25fY291bnQpLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAwLjkpICsKICBnZ3RpdGxlKCJHZXJtYW55IikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkKCmdnc2F2ZSgidGltZXNlcmllc19hbGxfdG90YWxfY291bnRfREVVLnBkZiIpCmBgYAoKCgojI0ZyYW5jZQpgYGB7cn0KZ2dwbG90KHN1YnNldCh0b3RhbF9jb3VudHMsIGNvdW50cnk9PSJGUkEiKSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IGhlYWx0aF9jb3VudCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gY2xpbWF0ZV9jb3VudCksIGNvbG91ciA9ICJkYXJrZ3JlZW4iLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGludGVyc2VjdGlvbl9jb3VudCksIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IDAuOSkgKwogIGdndGl0bGUoIkZyYW5jZSIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50X0ZSQS5wZGYiKQpgYGAKCgojI0NoaW5hCmBgYHtyfQp0b3RhbF9jb3VudHMgPC0gdG90YWxfY291bnRzICU+JSBhZGRfcm93KGNvdW50cnkgPSAiQ0hOIiwgeWVhciA9IDE5NzEsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApIAoKZ2dwbG90KHN1YnNldCh0b3RhbF9jb3VudHMsIGNvdW50cnk9PSJDSE4iKSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IGhlYWx0aF9jb3VudCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gY2xpbWF0ZV9jb3VudCksIGNvbG91ciA9ICJkYXJrZ3JlZW4iLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRhc2hlZCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGludGVyc2VjdGlvbl9jb3VudCksIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IDAuOSkgKwogIGdndGl0bGUoIkNoaW5hIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkKCmdnc2F2ZSgidGltZXNlcmllc19hbGxfdG90YWxfY291bnRfQ0hOLnBkZiIpCmBgYAoKCiMjTm9yd2F5CmBgYHtyfQp0b3RhbF9jb3VudHMgPC0gdG90YWxfY291bnRzICU+JSBhZGRfcm93KGNvdW50cnkgPSAiTk9SIiwgeWVhciA9IDE5NzAsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApICU+JSBhZGRfcm93KGNvdW50cnkgPSAiTk9SIiwgeWVhciA9IDE5NzEsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApICU+JSBhZGRfcm93KGNvdW50cnkgPSAiTk9SIiwgeWVhciA9IDE5NzIsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApCgpnZ3Bsb3Qoc3Vic2V0KHRvdGFsX2NvdW50cywgY291bnRyeT09Ik5PUiIpLCBhZXMoeD15ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fbGluZShhZXMoeT0gaGVhbHRoX2NvdW50KSwgY29sb3VyID0gImJsdWUiLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRvdGRhc2giKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBjbGltYXRlX2NvdW50KSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0gaW50ZXJzZWN0aW9uX2NvdW50KSwgY29sb3VyID0gInJlZCIsIGFscGhhID0gMC45KSArCiAgZ2d0aXRsZSgiTm9yd2F5IikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkKCmdnc2F2ZSgidGltZXNlcmllc19hbGxfdG90YWxfY291bnRfTk9SLnBkZiIpCmBgYAoKCiMjQXVzdHJhbGlhCmBgYHtyfQp0b3RhbF9jb3VudHMgPC0gdG90YWxfY291bnRzICU+JSBhZGRfcm93KGNvdW50cnkgPSAiQVVTIiwgeWVhciA9IDE5NzAsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApCgpnZ3Bsb3Qoc3Vic2V0KHRvdGFsX2NvdW50cywgY291bnRyeT09IkFVUyIpLCBhZXMoeD15ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fbGluZShhZXMoeT0gaGVhbHRoX2NvdW50KSwgY29sb3VyID0gImJsdWUiLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRvdGRhc2giKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBjbGltYXRlX2NvdW50KSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0gaW50ZXJzZWN0aW9uX2NvdW50KSwgY29sb3VyID0gInJlZCIsIGFscGhhID0gMC45KSArCiAgZ2d0aXRsZSgiQXVzdHJhbGlhIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkKCmdnc2F2ZSgidGltZXNlcmllc19hbGxfdG90YWxfY291bnRfQVVTLnBkZiIpCmBgYAoKCiMjSW5kaWEKYGBge3J9CnRvdGFsX2NvdW50cyA8LSB0b3RhbF9jb3VudHMgJT4lIGFkZF9yb3coY291bnRyeSA9ICJJTkQiLCB5ZWFyID0gMTk3MCwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lIGFkZF9yb3coY291bnRyeSA9ICJJTkQiLCB5ZWFyID0gMTk3MSwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkKCmdncGxvdChzdWJzZXQodG90YWxfY291bnRzLCBjb3VudHJ5PT0iSU5EIiksIGFlcyh4PXllYXIpKSArCiAgdGhlbWVfYncoKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBoZWFsdGhfY291bnQpLCBjb2xvdXIgPSAiYmx1ZSIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZG90ZGFzaCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGNsaW1hdGVfY291bnQpLCBjb2xvdXIgPSAiZGFya2dyZWVuIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBpbnRlcnNlY3Rpb25fY291bnQpLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAwLjkpICsKICBnZ3RpdGxlKCJJbmRpYSIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50X0lORC5wZGYiKQpgYGAKCgojI0JlbGdpdW0KYGBge3J9CnRvdGFsX2NvdW50cyA8LSB0b3RhbF9jb3VudHMgJT4lIGFkZF9yb3coY291bnRyeSA9ICJCRUwiLCB5ZWFyID0gMTk3MCwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lIGFkZF9yb3coY291bnRyeSA9ICJCRUwiLCB5ZWFyID0gMTk3MSwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lIGFkZF9yb3coY291bnRyeSA9ICJCRUwiLCB5ZWFyID0gMTk3MiwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lIGFkZF9yb3coY291bnRyeSA9ICJCRUwiLCB5ZWFyID0gMTk3MywgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lIGFkZF9yb3coY291bnRyeSA9ICJCRUwiLCB5ZWFyID0gMTk3NCwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgCgpnZ3Bsb3Qoc3Vic2V0KHRvdGFsX2NvdW50cywgY291bnRyeT09IkJFTCIpLCBhZXMoeD15ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fbGluZShhZXMoeT0gaGVhbHRoX2NvdW50KSwgY29sb3VyID0gImJsdWUiLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRvdGRhc2giKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBjbGltYXRlX2NvdW50KSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0gaW50ZXJzZWN0aW9uX2NvdW50KSwgY29sb3VyID0gInJlZCIsIGFscGhhID0gMC45KSArCiAgZ2d0aXRsZSgiQmVsZ2l1bSIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50X0JFTC5wZGYiKQpgYGAKCgojI0phcGFuCmBgYHtyfQoKdG90YWxfY291bnRzIDwtIHRvdGFsX2NvdW50cyAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTcwLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTcxLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTcyLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTczLCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTc0LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTc1LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTc2LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAlPiUgYWRkX3Jvdyhjb3VudHJ5ID0gIkpQTiIsIHllYXIgPSAxOTc3LCBjbGltYXRlX2NvdW50ID0gMCwgaGVhbHRoX2NvdW50ID0gMCwgaW50ZXJzZWN0aW9uX2NvdW50ICA9ICAwKSAKCmdncGxvdChzdWJzZXQodG90YWxfY291bnRzLCBjb3VudHJ5PT0iSlBOIiksIGFlcyh4PXllYXIpKSArCiAgdGhlbWVfYncoKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBoZWFsdGhfY291bnQpLCBjb2xvdXIgPSAiYmx1ZSIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZG90ZGFzaCIpICsKICBnZW9tX2xpbmUoYWVzKHk9IGNsaW1hdGVfY291bnQpLCBjb2xvdXIgPSAiZGFya2dyZWVuIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBpbnRlcnNlY3Rpb25fY291bnQpLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAwLjkpICsKICBnZ3RpdGxlKCJKYXBhbiIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50X0pQTi5wZGYiKQpgYGAKCiNFVQoKYGBge3J9CiNldSBwcmVzaWRlbmNpZXMKCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdCA8LSB0b3RhbF9jb3VudHMkY291bnRyeQoKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkJFTCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTcwXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJJVEEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3MV0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiTkxEIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzJdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkROSyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTczXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJGUkEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3NF0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVRBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzVdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIk5MRCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTc2XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3N10gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiREVVIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzhdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIklSTCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTc5XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJMVVgiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4MF0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiR0JSIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODFdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkROSyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTgyXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJHUkMiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4M10gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVJMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODRdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkxVWCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTg1XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJHQlIiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4Nl0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRE5LIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODddIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkdSQyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTg4XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJGUkEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4OV0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVRBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTBdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIk5MRCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTkxXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJHQlIiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5Ml0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiQkVMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTNdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkRFVSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTk0XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJFU1AiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5NV0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVJMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTZdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkxVWCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTk3XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJBVVQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5OF0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRklOIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTldIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkZSQSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDAwXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwMV0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRE5LIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDJdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIklUQSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDAzXSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJOTEQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwNF0gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiR0JSIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDVdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkZJTiIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDA2XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJQUlQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwN10gPC0gIkVVIgp0b3RhbF9jb3VudHMkY291bnRyeV9hbHRbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRlJBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDhdIDwtICJFVSIKdG90YWxfY291bnRzJGNvdW50cnlfYWx0W3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIlNXRSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDA5XSA8LSAiRVUiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2FsdFt0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAxMF0gPC0gIkVVIgoKCmBgYAoKCgpgYGB7cn0KCnRvdGFsX2NvdW50cyA8LSB0b3RhbF9jb3VudHMgJT4lIGFkZF9yb3coY291bnRyeV9hbHQgPSAiRVUiLCB5ZWFyID0gMTk3MCwgY2xpbWF0ZV9jb3VudCA9IDAsIGhlYWx0aF9jb3VudCA9IDAsIGludGVyc2VjdGlvbl9jb3VudCAgPSAgMCkgJT4lICBhZGRfcm93KGNvdW50cnlfYWx0ID0gIkVVIiwgeWVhciA9IDE5NzEsIGNsaW1hdGVfY291bnQgPSAwLCBoZWFsdGhfY291bnQgPSAwLCBpbnRlcnNlY3Rpb25fY291bnQgID0gIDApCgpnZ3Bsb3Qoc3Vic2V0KHRvdGFsX2NvdW50cywgY291bnRyeV9hbHQ9PSJFVSIpLCBhZXMoeD15ZWFyKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fbGluZShhZXMoeT0gaGVhbHRoX2NvdW50KSwgY29sb3VyID0gImJsdWUiLCBhbHBoYSA9IDAuOSwgbGluZXR5cGU9ImRvdGRhc2giKSArCiAgZ2VvbV9saW5lKGFlcyh5PSBjbGltYXRlX2NvdW50KSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0gaW50ZXJzZWN0aW9uX2NvdW50KSwgY29sb3VyID0gInJlZCIsIGFscGhhID0gMC45KSArCiAgZ2d0aXRsZSgiRVUiKSArIAogIHlsYWIoIlRvdGFsIG51bWJlciBvZiByZWZlcmVuY2VzIHBlciBVTkdEIHNlc3Npb24iKSArIHhsYWIoIlllYXIiKSArIAojICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMTQwKSwgYnJlYWtzID0gYygxLCA1MCwgMTAwLCAxMzQpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTkpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTkpKQoKZ2dzYXZlKCJ0aW1lc2VyaWVzX2FsbF90b3RhbF9jb3VudF9FVS5wZGYiKQpgYGAKCgoKIyBUaW1lIHNlcmllcyBvZiB0b3RhbCBjb3VudHMgcGxvdAoKIyMgdG90YWwgY291bnRzCgoKYGBge3J9CiMgY2FsY3VsYXRpbmcgdGhlIHRvdGFsIG51bWJlciBvZiBtZW50aW9ucyBieSB5ZWFyCnN1bSA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkodG90YWxfY291bnRzLCB5ZWFyKSwgCiAgICAgICAgICAgICAgICAgc3VtX0NDID0gc3VtKGNsaW1hdGVfY291bnQpLCBzdW1fUEggPSBzdW0oaGVhbHRoX2NvdW50KSwgc3VtX2ludCA9IHN1bShpbnRlcnNlY3Rpb25fY291bnQpLAogICAgICAgICAgICAgICAgIG1lYW5fQ0MgPSBtZWFuKGNsaW1hdGVfY291bnQpLCBtZWFuX1BIID0gbWVhbihoZWFsdGhfY291bnQpLCBtZWFuX2ludCA9IG1lYW4oaW50ZXJzZWN0aW9uX2NvdW50KSkKCmBgYAoKCgpgYGB7cn0KZ2dwbG90KHN1bSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IHN1bV9QSCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gc3VtX0NDKSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwojICBnZW9tX2xpbmUoYWVzKHk9IGNvdW50KSwgY29sb3VyID0gImJsYWNrIiwgYWxwaGEgPSAwLjkpICsKICAjZ2d0aXRsZSgiUG9saXRpY2FsIGVuZ2FnZW1lbnQgd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIGNsaW1hdGUgY2hhbmdlIGFuZCBoZWFsdGgiKSArIAogIHlsYWIoIlRvdGFsIG51bWJlciBvZiByZWZlcmVuY2VzIHBlciBVTkdEIHNlc3Npb24iKSArIHhsYWIoIlllYXIiKSArIAojICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMTQwKSwgYnJlYWtzID0gYygxLCA1MCwgMTAwLCAxMzQpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTkpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTkpKSsKIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDIwMDAsIHkgPSA4NTAsIGxhYmVsID0gIkNsaW1hdGUgQ2hhbmdlIiwgY29sb3VyID0gImRhcmtncmVlbiIpKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDE5OTMsIHkgPSAyNTAsIGxhYmVsID0gIkhlYWx0aCIsIGNvbG91ciA9ICJibHVlIikKCmdnc2F2ZSgidGltZXNlcmllc19QSENDX3RvdGFsX2NvdW50LnBkZiIpCmBgYAoKCgpgYGB7cn0KZ2dwbG90KHN1bSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IHN1bV9pbnQpLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAwLjkpICsKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsIDE0MCksIGJyZWFrcyA9IGMoMSwgNTAsIDEwMCwgMTM0KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkgKwogICBhbm5vdGF0ZSgidGV4dCIsIHggPSAyMDE1LCB5ID0gMjAsIGxhYmVsID0gIkludGVyc2VjdGlvbiIsIGNvbG91ciA9ICJyZWQiKQoKZ2dzYXZlKCJ0aW1lc2VyaWVzX2ludGVyc2VjdGlvbl90b3RhbF9jb3VudC5wZGYiKQpgYGAKCgoKYGBge3J9CnJlYWRyOjp3cml0ZV9jc3Yoc3VtLCAiZmlndXJlNTcuY3N2IikKYGBgCgoKCgpgYGB7cn0KZ2dwbG90KHN1bSwgYWVzKHg9eWVhcikpICsKICB0aGVtZV9idygpICsKICBnZW9tX2xpbmUoYWVzKHk9IHN1bV9QSCksIGNvbG91ciA9ICJibHVlIiwgYWxwaGEgPSAwLjksIGxpbmV0eXBlPSJkb3RkYXNoIikgKwogIGdlb21fbGluZShhZXMoeT0gc3VtX0NDKSwgY29sb3VyID0gImRhcmtncmVlbiIsIGFscGhhID0gMC45LCBsaW5ldHlwZT0iZGFzaGVkIikgKwogIGdlb21fbGluZShhZXMoeT0gc3VtX2ludCksIGNvbG91ciA9ICJyZWQiLCBhbHBoYSA9IDAuOSkgKwogICNnZ3RpdGxlKCJQb2xpdGljYWwgZW5nYWdlbWVudCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgY2xpbWF0ZSBjaGFuZ2UgYW5kIGhlYWx0aCIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsgCiMgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLCAxNDApLCBicmVha3MgPSBjKDEsIDUwLCAxMDAsIDEzNCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpKwogYW5ub3RhdGUoInRleHQiLCB4ID0gMjAwMCwgeSA9IDg1MCwgbGFiZWwgPSAiQ2xpbWF0ZSBDaGFuZ2UiLCBjb2xvdXIgPSAiZGFya2dyZWVuIikrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTk5MywgeSA9IDI1MCwgbGFiZWwgPSAiSGVhbHRoIiwgY29sb3VyID0gImJsdWUiKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMjAxNSwgeSA9IDEwMCwgbGFiZWwgPSAiSW50ZXJzZWN0aW9uIiwgY29sb3VyID0gInJlZCIpCgpnZ3NhdmUoInRpbWVzZXJpZXNfYWxsX3RvdGFsX2NvdW50LnBkZiIpCmBgYAoKCgoKCgoKCgoKCiMjIFByb3BvcnRpb24gb2YgY291bnRyaWVzIHByZXNlbnRhdGlvbgoKUHJvcG9ydGlvbiBvZiBjb3VudHJpZXMgdGhhdCBoYWQgYXQgbGVhc3Qgb25lIG1lbnRpb24KCkRhdGEgcHJlcGFyYXRpb24KCmBgYHtyfQoKY2xpbWF0ZV9zcGVlY2hlcyA8LSB0b3RhbF9jb3VudHMgJT4lIGZpbHRlcihjbGltYXRlX2NvdW50PjApICU+JSBncm91cF9ieSh5ZWFyKSAlPiUgdGFsbHkobmFtZSA9ICJjbGltYXRlX3NwZWVjaGVzIikKaGVhbHRoX3NwZWVjaGVzIDwtIHRvdGFsX2NvdW50cyAlPiUgZmlsdGVyKGhlYWx0aF9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhcikgJT4lIHRhbGx5KG5hbWUgPSAiaGVhbHRoX3NwZWVjaGVzIikKaW50ZXJzZWN0aW9uX3NwZWVjaGVzIDwtIHRvdGFsX2NvdW50cyAlPiUgZmlsdGVyKGludGVyc2VjdGlvbl9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhcikgJT4lIHRhbGx5KG5hbWUgPSAiaW50ZXJzZWN0aW9uX3NwZWVjaGVzIikKdG90YWxfc3BlZWNoZXMgPC0gdW5nZF9maWxlcyAlPiUgZ3JvdXBfYnkoWWVhcikgJT4lIHRhbGx5KG5hbWUgPSAidG90YWxfc3BlZWNoZXMiKQoKcHJvcG9ydGlvbnMgPC0gbGVmdF9qb2luKHRvdGFsX3NwZWVjaGVzLCBoZWFsdGhfc3BlZWNoZXMsIGJ5ID0gYygiWWVhciI9InllYXIiKSkgJT4lIAogIGxlZnRfam9pbiguLCBjbGltYXRlX3NwZWVjaGVzLCBieSA9IGMoIlllYXIiPSJ5ZWFyIikpICU+JSAKICBsZWZ0X2pvaW4oLiwgaW50ZXJzZWN0aW9uX3NwZWVjaGVzLCBieSA9IGMoIlllYXIiPSJ5ZWFyIikpICU+JSAKICByZXBsYWNlX25hKGxpc3QoaGVhbHRoX3NwZWVjaGVzPTAsIGNsaW1hdGVfc3BlZWNoZXM9MCwgaW50ZXJzZWN0aW9uX3NwZWVjaGVzPTApKQoKcHJvcG9ydGlvbnMkcGVyY2VudF9pbnQgPC0gcHJvcG9ydGlvbnMkaW50ZXJzZWN0aW9uX3NwZWVjaGVzL3Byb3BvcnRpb25zJHRvdGFsX3NwZWVjaGVzKjEwMApwcm9wb3J0aW9ucyRwZXJjZW50X0NDIDwtIHByb3BvcnRpb25zJGNsaW1hdGVfc3BlZWNoZXMvcHJvcG9ydGlvbnMkdG90YWxfc3BlZWNoZXMqMTAwCnByb3BvcnRpb25zJHBlcmNlbnRfUEggPC0gcHJvcG9ydGlvbnMkaGVhbHRoX3NwZWVjaGVzL3Byb3BvcnRpb25zJHRvdGFsX3NwZWVjaGVzKjEwMAoKcmVhZHI6OndyaXRlX2Nzdihwcm9wb3J0aW9ucywgInByb3BvcnRpb25fcmVzdWx0cy5jc3YiKQpgYGAKCgpQbG90dGluZyB0aGUgY291bnRyeSBwcm9wb3J0aW9uCgoKYGBge3J9CmdncGxvdChwcm9wb3J0aW9ucywgYWVzKHg9WWVhciwgeT1wZXJjZW50X0NDLCBncm91cCA9IDEpKSArCiAgZ2VvbV9saW5lKGNvbG91cj0iZGFya2dyZWVuIiwgc2l6ZT0xKSArCiAgdGhlbWVfYncoKSArCiAgI2dndGl0bGUoIlBvbGl0aWNhbCBlbmdhZ2VtZW50IHdpdGggdGhlIGludGVyc2VjdGlvbiBvZiBjbGltYXRlIGNoYW5nZSBhbmQgaGVhbHRoIikgKyAKICB5bGFiKCJQcm9wb3J0aW9uIG9mIGNvdW50cmllcyBkaXNjdXNzaW5nIGNsaW1hdGUgY2hhbmdlLCAlIikgKyB4bGFiKCJZZWFyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpCgogZ2dzYXZlKCJ0b3RhbF9wZXJjZW50X0NDLnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnMsIGFlcyh4PVllYXIsIHk9cGVyY2VudF9QSCwgZ3JvdXAgPSAxKSkgKwogIGdlb21fbGluZShjb2xvdXI9ImJsdWUiLCBzaXplPTEpICsKICB0aGVtZV9idygpICsKICAjZ2d0aXRsZSgiUG9saXRpY2FsIGVuZ2FnZW1lbnQgd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIGNsaW1hdGUgY2hhbmdlIGFuZCBoZWFsdGgiKSArIAogIHlsYWIoIlByb3BvcnRpb24gb2YgY291bnRyaWVzIGRpc2N1c3NpbmcgaGVhbHRoLCAlIikgKyB4bGFiKCJZZWFyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwyMDEwLCAyMDE5KSkKCiAgZ2dzYXZlKCJ0b3RhbF9wZXJjZW50X1BILnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnMsIGFlcyh4PVllYXIsIHk9cGVyY2VudF9pbnQsIGdyb3VwID0gMSkpICsKICBnZW9tX2xpbmUoY29sb3VyPSJyZWQiLCBzaXplPTEpICsKICB0aGVtZV9idygpICsKICAjZ2d0aXRsZSgiUG9saXRpY2FsIGVuZ2FnZW1lbnQgd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIGNsaW1hdGUgY2hhbmdlIGFuZCBoZWFsdGgiKSArIAogIHlsYWIoIlByb3BvcnRpb24gb2YgY291bnRyaWVzIGRpc2N1c3NpbmcgaW50ZXJzZWN0aW9uLCAlIikgKyB4bGFiKCJZZWFyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpCgogIGdnc2F2ZSgidG90YWxfcGVyY2VudF9pbnRlcnNlY3Rpb24ucGRmIikKYGBgCgoKYGBge3J9CmdncGxvdChwcm9wb3J0aW9ucywgYWVzKHg9WWVhcikpICsKICBnZW9tX2xpbmUoYWVzKHk9cGVyY2VudF9pbnQpLCBjb2xvdXI9InJlZCIsIHNpemU9MSkgKwogIGdlb21fbGluZShhZXMoeT1wZXJjZW50X0NDKSwgY29sb3VyPSJkYXJrZ3JlZW4iLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplPTEpICsKICBnZW9tX2xpbmUoYWVzKHk9cGVyY2VudF9QSCksIGNvbG91cj0iYmx1ZSIsIGxpbmV0eXBlID0gImRvdGRhc2giLCBzaXplPTEpICsKICB0aGVtZV9idygpICsKICAjZ2d0aXRsZSgiUG9saXRpY2FsIGVuZ2FnZW1lbnQgd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIGNsaW1hdGUgY2hhbmdlIGFuZCBoZWFsdGgiKSArIAogIHlsYWIoIlByb3BvcnRpb24gb2YgY291bnRyaWVzLCAlIikgKyB4bGFiKCJZZWFyIikgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpKwogYW5ub3RhdGUoInRleHQiLCB4ID0gMjAxNCwgeSA9IDMwLCBsYWJlbCA9ICJJbnRlcnNlY3Rpb24iLCBjb2xvdXIgPSAicmVkIikrCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTk3NSwgeSA9IDU1LCBsYWJlbCA9ICJIZWFsdGgiLCBjb2xvdXIgPSAiYmx1ZSIpICsKICBhbm5vdGF0ZSgidGV4dCIsIHggPSAxOTg4LCB5ID0gMjcsIGxhYmVsID0gIkNsaW1hdGUgQ2hhbmdlIiwgY29sb3VyID0gImRhcmtncmVlbiIpCgogIGdnc2F2ZSgiYWxsX3RocmVlX3BlcmNlbnQucGRmIikKYGBgCgoKCgoKI1RpZXIgQW5hbHlzaXMKCgpgYGB7cn0Kc2lkc19jb3VudHJpZXMgPC0gYygiQVNNIiwiQUlBIiwiQVRHIiwiQUJXIiwiQkhTIiwiQkhSIiwiQlJCIiwiQkxaIiwiQk1VIiwiQ1BWIiwiQ09NIiwiQ09LIiwiQ1VCIiwiRE1BIiwiRE9NIiwiRkpJIiwiR1JEIiwiR1VNIiwiR05CIiwiR1VZIiwiSFRJIiwiSkFNIiwiS0lSIiwiTURWIiwiTUhMIiwiTVVTIiwiRlNNIiwiTVNSIiwiTlJVIiwiTkNMIiwiTklVIiwiUExXIiwiUE5HIiwiUFJJIiwiS05BIiwiTENBIiwiVkNUIiwiV1NNIiwiU1RQIiwiU1lDIiwiU0dQIiwiU0xCIiwiU1VSIiwiVExTIiwiVE9OIiwiVFRPIiwiVFVWIiwiVlVUIikKdGllcjFfY291bnRyaWVzIDwtIGMoIlVTQSIsIkVVIiwgIkNITiIpCnRpZXIyX2NvdW50cmllcyA8LSBjKCJQT0wiLCJBVVMiLCAiWkFGIiwgIkJSQSIsICJJTkQiLCAiRlJBIiwgIkRFVSIsICJJRE4iLCAiR0JSIikKCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3VwcyA8LSBpZmVsc2UodG90YWxfY291bnRzJGNvdW50cnkgJWluJSBzaWRzX2NvdW50cmllcywgIlNJRFMiLCAibm9uZSIpCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeSAlaW4lIHRpZXIxX2NvdW50cmllc10gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnkgJWluJSB0aWVyMl9jb3VudHJpZXNdIDwtICJUaWVyMiIKCiNldSBwcmVzaWRlbmNpZXMKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkJFTCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTcwXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJJVEEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3MV0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiTkxEIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzJdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkROSyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTczXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJGUkEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3NF0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVRBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzVdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIk5MRCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTc2XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk3N10gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiREVVIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5NzhdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIklSTCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTc5XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJMVVgiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4MF0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiR0JSIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODFdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkROSyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTgyXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJHUkMiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4M10gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVJMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODRdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkxVWCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTg1XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJHQlIiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4Nl0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRE5LIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5ODddIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkdSQyIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTg4XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJGUkEiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk4OV0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVRBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTBdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIk5MRCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTkxXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJHQlIiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5Ml0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiQkVMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTNdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkRFVSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTk0XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJFU1AiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5NV0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiSVJMIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTZdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkxVWCIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAxOTk3XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJBVVQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMTk5OF0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRklOIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDE5OTldIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkZSQSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDAwXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwMV0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRE5LIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDJdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIklUQSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDAzXSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJOTEQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwNF0gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiR0JSIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDVdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIkZJTiIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDA2XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJQUlQiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAwN10gPC0gIlRpZXIxIgp0b3RhbF9jb3VudHMkY291bnRyeV9ncm91cHNbdG90YWxfY291bnRzJGNvdW50cnk9PSAiRlJBIiAmIHRvdGFsX2NvdW50cyR5ZWFyID09IDIwMDhdIDwtICJUaWVyMSIKdG90YWxfY291bnRzJGNvdW50cnlfZ3JvdXBzW3RvdGFsX2NvdW50cyRjb3VudHJ5PT0gIlNXRSIgJiB0b3RhbF9jb3VudHMkeWVhciA9PSAyMDA5XSA8LSAiVGllcjEiCnRvdGFsX2NvdW50cyRjb3VudHJ5X2dyb3Vwc1t0b3RhbF9jb3VudHMkY291bnRyeT09ICJCRUwiICYgdG90YWxfY291bnRzJHllYXIgPT0gMjAxMF0gPC0gIlRpZXIxIgoKCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHMgPC0gaWZlbHNlKHVuZ2RfZmlsZXMkQ291bnRyeSAlaW4lIHNpZHNfY291bnRyaWVzLCAiU0lEUyIsICJub25lIikKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnkgJWluJSB0aWVyMV9jb3VudHJpZXNdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnkgJWluJSB0aWVyMl9jb3VudHJpZXNdIDwtICJUaWVyMiIKCgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJCRUwiICYgdW5nZF9maWxlcyRZZWFyID09IDE5NzBdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiSVRBIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTcxXSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIk5MRCIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk3Ml0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJETksiICYgdW5nZF9maWxlcyRZZWFyID09IDE5NzNdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiRlJBIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTc0XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIklUQSIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk3NV0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJOTEQiICYgdW5nZF9maWxlcyRZZWFyID09IDE5NzZdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiQkVMIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTc3XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkRFVSIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk3OF0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJJUkwiICYgdW5nZF9maWxlcyRZZWFyID09IDE5NzldIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiTFVYIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTgwXSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkdCUiIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk4MV0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJETksiICYgdW5nZF9maWxlcyRZZWFyID09IDE5ODJdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiR1JDIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTgzXSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIklSTCIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk4NF0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJMVVgiICYgdW5nZF9maWxlcyRZZWFyID09IDE5ODVdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiR0JSIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTg2XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkROSyIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk4N10gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJHUkMiICYgdW5nZF9maWxlcyRZZWFyID09IDE5ODhdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiRlJBIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTg5XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIklUQSIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk5MF0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJOTEQiICYgdW5nZF9maWxlcyRZZWFyID09IDE5OTFdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiR0JSIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTkyXSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkJFTCIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk5M10gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJERVUiICYgdW5nZF9maWxlcyRZZWFyID09IDE5OTRdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiRVNQIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTk1XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIklSTCIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk5Nl0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJMVVgiICYgdW5nZF9maWxlcyRZZWFyID09IDE5OTddIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiQVVUIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAxOTk4XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkZJTiIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMTk5OV0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJGUkEiICYgdW5nZF9maWxlcyRZZWFyID09IDIwMDBdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiQkVMIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAyMDAxXSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkROSyIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMjAwMl0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJJVEEiICYgdW5nZF9maWxlcyRZZWFyID09IDIwMDNdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiTkxEIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAyMDA0XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkdCUiIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMjAwNV0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJGSU4iICYgdW5nZF9maWxlcyRZZWFyID09IDIwMDZdIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiUFJUIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAyMDA3XSA8LSAiVGllcjEiCnVuZ2RfZmlsZXMkY291bnRyeV9ncm91cHNbdW5nZF9maWxlcyRDb3VudHJ5PT0gIkZSQSIgJiB1bmdkX2ZpbGVzJFllYXIgPT0gMjAwOF0gPC0gIlRpZXIxIgp1bmdkX2ZpbGVzJGNvdW50cnlfZ3JvdXBzW3VuZ2RfZmlsZXMkQ291bnRyeT09ICJTV0UiICYgdW5nZF9maWxlcyRZZWFyID09IDIwMDldIDwtICJUaWVyMSIKdW5nZF9maWxlcyRjb3VudHJ5X2dyb3Vwc1t1bmdkX2ZpbGVzJENvdW50cnk9PSAiQkVMIiAmIHVuZ2RfZmlsZXMkWWVhciA9PSAyMDEwXSA8LSAiVGllcjEiCgoKYGBgCgoKYGBge3J9CgpjbGltYXRlX3NwZWVjaGVzX2dyb3VwcyA8LSB0b3RhbF9jb3VudHMgJT4lIGZpbHRlcihjbGltYXRlX2NvdW50PjApICU+JSBncm91cF9ieSh5ZWFyLCBjb3VudHJ5X2dyb3VwcykgJT4lIHRhbGx5KG5hbWUgPSAiY2xpbWF0ZV9zcGVlY2hlcyIpCgpoZWFsdGhfc3BlZWNoZXNfZ3JvdXBzIDwtIHRvdGFsX2NvdW50cyAlPiUgZmlsdGVyKGhlYWx0aF9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhciwgY291bnRyeV9ncm91cHMpICU+JSB0YWxseShuYW1lID0gImhlYWx0aF9zcGVlY2hlcyIpCgppbnRlcnNlY3Rpb25fc3BlZWNoZXNfZ3JvdXBzIDwtIHRvdGFsX2NvdW50cyAlPiUgZmlsdGVyKGludGVyc2VjdGlvbl9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhciwgY291bnRyeV9ncm91cHMpICU+JSB0YWxseShuYW1lID0gImludGVyc2VjdGlvbl9zcGVlY2hlcyIpCgoKdG90YWxfc3BlZWNoZXNfZ3JvdXBzIDwtIHVuZ2RfZmlsZXMgJT4lIAogIGdyb3VwX2J5KFllYXIsIGNvdW50cnlfZ3JvdXBzKSAlPiUgdGFsbHkobmFtZSA9ICJ0b3RhbF9zcGVlY2hlcyIpCgpwcm9wb3J0aW9uc19ncm91cHMgPC0gbGVmdF9qb2luKHRvdGFsX3NwZWVjaGVzX2dyb3VwcywgaGVhbHRoX3NwZWVjaGVzX2dyb3VwcywgYnkgPSBjKCJZZWFyIj0ieWVhciIsICJjb3VudHJ5X2dyb3VwcyIpKSAlPiUgCiAgbGVmdF9qb2luKC4sIGNsaW1hdGVfc3BlZWNoZXNfZ3JvdXBzLCBieSA9IGMoIlllYXIiPSJ5ZWFyIiwgImNvdW50cnlfZ3JvdXBzIikpICU+JSAKICBsZWZ0X2pvaW4oLiwgaW50ZXJzZWN0aW9uX3NwZWVjaGVzX2dyb3VwcywgYnkgPSBjKCJZZWFyIj0ieWVhciIsICJjb3VudHJ5X2dyb3VwcyIpKSAlPiUgCiAgcmVwbGFjZV9uYShsaXN0KGhlYWx0aF9zcGVlY2hlcz0wLCBjbGltYXRlX3NwZWVjaGVzPTAsIGludGVyc2VjdGlvbl9zcGVlY2hlcz0wKSkKCnByb3BvcnRpb25zX2dyb3VwcyRwZXJjZW50X2ludCA8LSBwcm9wb3J0aW9uc19ncm91cHMkaW50ZXJzZWN0aW9uX3NwZWVjaGVzL3Byb3BvcnRpb25zX2dyb3VwcyR0b3RhbF9zcGVlY2hlcyoxMDAKCnByb3BvcnRpb25zX2dyb3VwcyRwZXJjZW50X0NDIDwtIHByb3BvcnRpb25zX2dyb3VwcyRjbGltYXRlX3NwZWVjaGVzL3Byb3BvcnRpb25zX2dyb3VwcyR0b3RhbF9zcGVlY2hlcyoxMDAKCnByb3BvcnRpb25zX2dyb3VwcyRwZXJjZW50X1BIIDwtIHByb3BvcnRpb25zX2dyb3VwcyRoZWFsdGhfc3BlZWNoZXMvcHJvcG9ydGlvbnNfZ3JvdXBzJHRvdGFsX3NwZWVjaGVzKjEwMAoKcHJvcG9ydGlvbnNfZ3JvdXBzIDwtIHByb3BvcnRpb25zX2dyb3VwcyAlPiUgZmlsdGVyKGNvdW50cnlfZ3JvdXBzIT0ibm9uZSIpCgpgYGAKCgojI1RvdGFsIGNvdW50IHBsb3RzIGJ5IGNvdW50cnkgZ3JvdXAKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfZ3JvdXBzLCBhZXMoeD1ZZWFyLCB5PWhlYWx0aF9zcGVlY2hlcywgZ3JvdXA9Y291bnRyeV9ncm91cHMsIGxpbmV0eXBlID0gY291bnRyeV9ncm91cHMsIGNvbG91ciA9IGNvdW50cnlfZ3JvdXBzKSkgKwogICAgZ2VvbV9saW5lKCkgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpLCBsaW5ldHlwZSA9IEZBTFNFKSArCiBndWlkZXMobGluZXR5cGU9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpKSArCiAgdGhlbWVfYncoKSArCiAgZ2d0aXRsZSgiSGVhbHRoIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkKCiAgZ2dzYXZlKCJQSF90b3RhbF9ieV9jb3VudHJ5X2dyb3VwLnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfZ3JvdXBzLCBhZXMoeD1ZZWFyLCB5PWNsaW1hdGVfc3BlZWNoZXMsIGdyb3VwPWNvdW50cnlfZ3JvdXBzLCBsaW5ldHlwZSA9IGNvdW50cnlfZ3JvdXBzLCBjb2xvdXIgPSBjb3VudHJ5X2dyb3VwcykpICsKICAgIGdlb21fbGluZSgpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSwgbGluZXR5cGUgPSBGQUxTRSkgKwogZ3VpZGVzKGxpbmV0eXBlPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSkgKwogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIkNsaW1hdGUgQ2hhbmdlIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkKCiAgZ2dzYXZlKCJDQ190b3RhbF9ieV9jb3VudHJ5X2dyb3VwLnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfZ3JvdXBzLCBhZXMoeD1ZZWFyLCB5PWludGVyc2VjdGlvbl9zcGVlY2hlcywgZ3JvdXA9Y291bnRyeV9ncm91cHMsIGxpbmV0eXBlID0gY291bnRyeV9ncm91cHMsIGNvbG91ciA9IGNvdW50cnlfZ3JvdXBzKSkgKwogICAgZ2VvbV9saW5lKCkgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpLCBsaW5ldHlwZSA9IEZBTFNFKSArCiBndWlkZXMobGluZXR5cGU9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpKSArCiAgdGhlbWVfYncoKSArCiAgZ2d0aXRsZSgiSW50ZXJzZWN0aW9uIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkKCiAgZ2dzYXZlKCJpbnRlcnNlY3Rpb25fdG90YWxfYnlfY291bnRyeV9ncm91cC5wZGYiKQpgYGAKCgoKIyNQcm9wb3J0aW9uIHBsb3RzIGJ5IGNvdW50cnkgZ3JvdXAKCgpgYGB7cn0KZ2dwbG90KHByb3BvcnRpb25zX2dyb3VwcywgYWVzKHg9WWVhciwgeT1wZXJjZW50X1BILCBncm91cD1jb3VudHJ5X2dyb3VwcywgbGluZXR5cGUgPSBjb3VudHJ5X2dyb3VwcywgY29sb3VyID0gY291bnRyeV9ncm91cHMpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCksIGxpbmV0eXBlID0gRkFMU0UpICsKIGd1aWRlcyhsaW5ldHlwZT1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXNjdXNzaW9uIG9mIEhlYWx0aCIpICsgCiAgeWxhYigiUHJvcG9ydGlvbiBvZiBDb3VudHJpZXMsICUiKSArIHhsYWIoIlllYXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTkpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsICAyMDEwLCAyMDE5KSkKCiAgZ2dzYXZlKCJQSF9wZXJjZW50X2NvdW50cnlfZ3JvdXAucGRmIikKYGBgCgoKCgpgYGB7cn0KZ2dwbG90KHByb3BvcnRpb25zX2dyb3VwcywgYWVzKHg9WWVhciwgeT1wZXJjZW50X0NDLCBncm91cD1jb3VudHJ5X2dyb3VwcywgbGluZXR5cGUgPSBjb3VudHJ5X2dyb3VwcywgY29sb3VyID0gY291bnRyeV9ncm91cHMpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCksIGxpbmV0eXBlID0gRkFMU0UpICsKIGd1aWRlcyhsaW5ldHlwZT1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXNjdXNzaW9uIG9mIENsaW1hdGUgQ2hhbmdlIikgKyAKICB5bGFiKCJQcm9wb3J0aW9uIG9mIENvdW50cmllcywgJSIpICsgeGxhYigiWWVhciIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpCgogIGdnc2F2ZSgiQ0NfcGVyY2VudF9jb3VudHJ5X2dyb3VwLnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfZ3JvdXBzLCBhZXMoeD1ZZWFyLCB5PXBlcmNlbnRfaW50LCBncm91cD1jb3VudHJ5X2dyb3VwcywgbGluZXR5cGUgPSBjb3VudHJ5X2dyb3VwcywgY29sb3VyID0gY291bnRyeV9ncm91cHMpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCksIGxpbmV0eXBlID0gRkFMU0UpICsKIGd1aWRlcyhsaW5ldHlwZT1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXNjdXNzaW9uIG9mIGludGVyc2VjdGlvbiIpICsgCiAgeWxhYigiUHJvcG9ydGlvbiBvZiBDb3VudHJpZXMsICUiKSArIHhsYWIoIlllYXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTkpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTkpKQoKICBnZ3NhdmUoImludGVyc2VjdGlvbl9wZXJjZW50X2NvdW50cnlfZ3JvdXAucGRmIikKYGBgCgoKCgoKI1dITyByZWdpb25zCgojIyBUb3RhbCBjb3VudHMgYnkgV0hPIHJlZ2lvbgoKVXNpbmcgVU4gTTQ5IFN0YW5kYXJkIChTdGFuZGFyZCBjb3VudHJ5IG9yIGFyZWEgY29kZXMgZm9yIHN0YXRpc3RpY2FsIHVzZSAoTTQ5KSkgd2UgY3JlYXRlIHJlZ2lvbmFsIGFuZCBzdWItcmVnaW9uYWwgZ3JvdXBpbmdzIG9mIGNvdW50cmllcy4gW2h0dHBzOi8vdW5zdGF0cy51bi5vcmcvdW5zZC9tZXRob2RvbG9neS9tNDkvXQoKCmBgYHtyfQojbG9hZGluZyBXSE8gcmVnaW9ucyBjb3VudHJ5IGlkZW50aWZpZXJzIGFuZCBwcmVwcm9jZXNzaW5nCnJlZ2lvbnMgPC0gcmVhZHI6OnJlYWRfY3N2KCIuLi9VTlNEIC0gTWV0aG9kb2xvZ3kuY3N2IikKCiNVTkdEQyB1c2VkIFlVRyBkZXNpZ25hdGlvbiB3aGlsZSBXSE8gaXMgdXNpbmcgU1JCCnRvdGFsX2NvdW50cyRjb3VudHJ5IDwtIHN0cl9yZXBsYWNlKHRvdGFsX2NvdW50cyRjb3VudHJ5LCAiWVVHIiwgIlNSQiIpCgojbWVyZ2luZyBXSE8gZGVzaWduYXRpb25zIHdpdGggbWVudGlvbiBjb3VudHMKcmVnaW9uYWxfZGF0YSA8LSBpbm5lcl9qb2luKHRvdGFsX2NvdW50cywgcmVnaW9ucywgYnkgPSBjKCJjb3VudHJ5IiA9ICJJU08tYWxwaGEzIENvZGUiKSkKCiMgdG90YWwgc3VtIG9mIG1lbnRpb24gY291bnRzIGJ5IHllYXIgYW5kIFdITyByZWdpb24sIHdpdGggbWVhbnMKd2hvX3N1bSA8LSBzdW1tYXJpc2UoZ3JvdXBfYnkocmVnaW9uYWxfZGF0YSwgeWVhciwgV0hPKSwgCiAgICAgICAgICAgICAgICAgICAgIHdob19pbnQgPSBzdW0oaW50ZXJzZWN0aW9uX2NvdW50KSwgd2hvX1BIID0gc3VtKGhlYWx0aF9jb3VudCksIHdob19DQyA9IHN1bShjbGltYXRlX2NvdW50KSkKCmBgYAoKYGBge3J9CnJlYWRyOjp3cml0ZV9jc3YocmVnaW9uYWxfZGF0YSwgIndob19yZWdpb25zX2RhdGEuY3N2IikKcmVhZHI6OndyaXRlX2Nzdih3aG9fc3VtLCAiZmlndXJlNTguY3N2IikKCmBgYAoKCgpQbG90IGJ5IHJlZ2lvbgoKCmBgYHtyfQpnZ3Bsb3Qod2hvX3N1bSwgYWVzKHg9eWVhciwgeT13aG9fUEgsIGdyb3VwPVdITywgbGluZXR5cGUgPSBXSE8sIGNvbG91ciA9IFdITykpICsKICAgIGdlb21fbGluZSgpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSwgbGluZXR5cGUgPSBGQUxTRSkgKwogZ3VpZGVzKGxpbmV0eXBlPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSkgKwogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIkhlYWx0aCIpICsgCiAgeWxhYigiVG90YWwgbnVtYmVyIG9mIHJlZmVyZW5jZXMgcGVyIFVOR0Qgc2Vzc2lvbiIpICsgeGxhYigiWWVhciIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMTk3MCwgMjAxOSksIGJyZWFrcyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxOSkpCgogIGdnc2F2ZSgiUEhfdG90YWxfYnlfd2hvLnBkZiIpCmBgYAoKCgoKCmBgYHtyfQpnZ3Bsb3Qod2hvX3N1bSwgYWVzKHg9eWVhciwgeT13aG9fQ0MsIGdyb3VwPVdITywgbGluZXR5cGUgPSBXSE8sIGNvbG91ciA9IFdITykpICsKICAgIGdlb21fbGluZSgpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSwgbGluZXR5cGUgPSBGQUxTRSkgKwogZ3VpZGVzKGxpbmV0eXBlPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSkgKwogIHRoZW1lX2J3KCkgKwogIGdndGl0bGUoIkNsaW1hdGUgQ2hhbmdlIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkKCiAgZ2dzYXZlKCJDQ190b3RhbF9ieV93aG8ucGRmIikKYGBgCgoKCgpgYGB7cn0KZ2dwbG90KHdob19zdW0sIGFlcyh4PXllYXIsIHk9d2hvX2ludCwgZ3JvdXA9V0hPLCBsaW5ldHlwZSA9IFdITywgY29sb3VyID0gV0hPKSkgKwogICAgZ2VvbV9saW5lKCkgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpLCBsaW5ldHlwZSA9IEZBTFNFKSArCiBndWlkZXMobGluZXR5cGU9Z3VpZGVfbGVnZW5kKHRpdGxlPU5VTEwpKSArCiAgdGhlbWVfYncoKSArCiAgZ2d0aXRsZSgiSW50ZXJzZWN0aW9uIikgKyAKICB5bGFiKCJUb3RhbCBudW1iZXIgb2YgcmVmZXJlbmNlcyBwZXIgVU5HRCBzZXNzaW9uIikgKyB4bGFiKCJZZWFyIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxOTcwLCAyMDE5KSwgYnJlYWtzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE5KSkKCiAgZ2dzYXZlKCJpbnRlcnNlY3Rpb25fdG90YWxfYnlfd2hvLnBkZiIpCmBgYAoKCgoKCiMjIFByb3BvcnRpb24gYnkgV0hPIHJlZ2lvbgoKRGF0YSBwcmVwYXJhdGlvbgoKYGBge3J9CgpjbGltYXRlX3NwZWVjaGVzX3dobyA8LSByZWdpb25hbF9kYXRhICU+JSBmaWx0ZXIoY2xpbWF0ZV9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhciwgV0hPKSAlPiUgdGFsbHkobmFtZSA9ICJjbGltYXRlX3NwZWVjaGVzIikKaGVhbHRoX3NwZWVjaGVzX3dobyA8LSByZWdpb25hbF9kYXRhICU+JSBmaWx0ZXIoaGVhbHRoX2NvdW50PjApICU+JSBncm91cF9ieSh5ZWFyLCBXSE8pICU+JSB0YWxseShuYW1lID0gImhlYWx0aF9zcGVlY2hlcyIpCmludGVyc2VjdGlvbl9zcGVlY2hlc193aG8gPC0gcmVnaW9uYWxfZGF0YSAlPiUgZmlsdGVyKGludGVyc2VjdGlvbl9jb3VudD4wKSAlPiUgZ3JvdXBfYnkoeWVhciwgV0hPKSAlPiUgdGFsbHkobmFtZSA9ICJpbnRlcnNlY3Rpb25fc3BlZWNoZXMiKQoKI21lcmdpbmcgV0hPIGRlc2lnbmF0aW9ucyB3aXRoIG1lbnRpb24gY291bnRzCnVuZ2RfZmlsZXMkQ291bnRyeSA8LSBzdHJfcmVwbGFjZSh1bmdkX2ZpbGVzJENvdW50cnksICJZVUciLCAiU1JCIikKCnRvdGFsX3NwZWVjaGVzX3dobyA8LSBpbm5lcl9qb2luKHVuZ2RfZmlsZXMsIHJlZ2lvbnMsIGJ5ID0gYygiQ291bnRyeSIgPSAiSVNPLWFscGhhMyBDb2RlIikpICU+JSAKICBncm91cF9ieShZZWFyLCBXSE8pICU+JSB0YWxseShuYW1lID0gInRvdGFsX3NwZWVjaGVzIikKCnByb3BvcnRpb25zX3dobyA8LSBsZWZ0X2pvaW4odG90YWxfc3BlZWNoZXNfd2hvLCBoZWFsdGhfc3BlZWNoZXNfd2hvLCBieSA9IGMoIlllYXIiPSJ5ZWFyIiwgIldITyIpKSAlPiUgCiAgbGVmdF9qb2luKC4sIGNsaW1hdGVfc3BlZWNoZXNfd2hvLCBieSA9IGMoIlllYXIiPSJ5ZWFyIiwgIldITyIpKSAlPiUgCiAgbGVmdF9qb2luKC4sIGludGVyc2VjdGlvbl9zcGVlY2hlc193aG8sIGJ5ID0gYygiWWVhciI9InllYXIiLCAiV0hPIikpICU+JSAKICByZXBsYWNlX25hKGxpc3QoaGVhbHRoX3NwZWVjaGVzPTAsIGNsaW1hdGVfc3BlZWNoZXM9MCwgaW50ZXJzZWN0aW9uX3NwZWVjaGVzPTApKQoKcHJvcG9ydGlvbnNfd2hvJHBlcmNlbnRfaW50IDwtIHByb3BvcnRpb25zX3dobyRpbnRlcnNlY3Rpb25fc3BlZWNoZXMvcHJvcG9ydGlvbnNfd2hvJHRvdGFsX3NwZWVjaGVzKjEwMApwcm9wb3J0aW9uc193aG8kcGVyY2VudF9DQyA8LSBwcm9wb3J0aW9uc193aG8kY2xpbWF0ZV9zcGVlY2hlcy9wcm9wb3J0aW9uc193aG8kdG90YWxfc3BlZWNoZXMqMTAwCnByb3BvcnRpb25zX3dobyRwZXJjZW50X1BIIDwtIHByb3BvcnRpb25zX3dobyRoZWFsdGhfc3BlZWNoZXMvcHJvcG9ydGlvbnNfd2hvJHRvdGFsX3NwZWVjaGVzKjEwMAoKYGBgCgoKYGBge3J9CnJlYWRyOjp3cml0ZV9jc3YocHJvcG9ydGlvbnNfd2hvLCAiZmlndXJlNTYuY3N2IikKYGBgCgoKUGxvdHRpbmcKCgpgYGB7cn0KZ2dwbG90KHByb3BvcnRpb25zX3dobywgYWVzKHg9WWVhciwgeT1wZXJjZW50X1BILCBncm91cD1XSE8sIGxpbmV0eXBlID0gV0hPLCBjb2xvdXIgPSBXSE8pKSArCiAgICBnZW9tX2xpbmUoKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCksIGxpbmV0eXBlID0gRkFMU0UpICsKIGd1aWRlcyhsaW5ldHlwZT1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXNjdXNzaW9uIG9mIEhlYWx0aCIpICsgCiAgeWxhYigiUHJvcG9ydGlvbiBvZiBDb3VudHJpZXMsICUiKSArIHhsYWIoIlllYXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTkpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTkpKQoKICBnZ3NhdmUoIlBIX3BlcmNlbnRfd2hvLnBkZiIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfd2hvLCBhZXMoeD1ZZWFyLCB5PXBlcmNlbnRfQ0MsIGdyb3VwPVdITywgbGluZXR5cGUgPSBXSE8sIGNvbG91ciA9IFdITykpICsKICAgIGdlb21fbGluZSgpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSwgbGluZXR5cGUgPSBGQUxTRSkgKwogZ3VpZGVzKGxpbmV0eXBlPWd1aWRlX2xlZ2VuZCh0aXRsZT1OVUxMKSkgKwogIHRoZW1lX2J3KCkgKwogZ2d0aXRsZSgiRGlzY3Vzc2lvbiBvZiBDbGltYXRlIENoYW5nZSIpICsgCiAgeWxhYigiUHJvcG9ydGlvbiBvZiBDb3VudHJpZXMsICUiKSArIHhsYWIoIlllYXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTkpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTkpKQoKICBnZ3NhdmUoIkNDX3BlcmNlbnRfd2hvLnBkZiIpCmBgYAoKCgoKCmBgYHtyfQpnZ3Bsb3QocHJvcG9ydGlvbnNfd2hvLCBhZXMoeD1ZZWFyLCB5PXBlcmNlbnRfaW50LCBncm91cD1XSE8sIGxpbmV0eXBlID0gV0hPLCBjb2xvdXIgPSBXSE8pKSArCiAgICBnZW9tX2xpbmUoKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCksIGxpbmV0eXBlID0gRkFMU0UpICsKIGd1aWRlcyhsaW5ldHlwZT1ndWlkZV9sZWdlbmQodGl0bGU9TlVMTCkpICsKICB0aGVtZV9idygpICsKICBnZ3RpdGxlKCJEaXNjdXNzaW9uIG9mIEludGVyc2VjdGlvbiIpICsgCiAgeWxhYigiUHJvcG9ydGlvbiBvZiBjb3VudHJpZXMsICUiKSArIHhsYWIoIlllYXIiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDE5NzAsIDIwMTkpLCBicmVha3MgPSBjKDE5NzAsIDE5ODAsIDE5OTAsIDIwMDAsIDIwMTAsIDIwMTkpKQoKICBnZ3NhdmUoImludGVyc2VjdGlvbl9wZXJjZW50X3doby5wZGYiKQpgYGAKCgoKCg==